2011-09-29 7 views
0
var query = 
    from dt1 in dtStudent.AsEnumerable() 
    join dt2 in dtMarks.AsEnumerable() 
     on dt1.Field<int>("StudentID") 
     equals dt2.Field<int>("StudentID") 
    select new StudentMark 
    { 
     StudentName = dt1.Field<string>("StudentName"), 
     Mark = dt2.Field<int>("Mark") 
    }; 

上記のコーディングでは、AsEnumerableの意義は何ですか? AsEnumerableが.NET Frameworkに存在しない場合、上記のタスクを実行する開発者のアプローチは何ですか?AsEnumerableの意義?

答えて

3

これを正しく解釈しているとすれば、それはDataTableExtensions.AsEnumerable()です。それ以外の場合(またはそれに類するもの)、DataTableIEnumerable<T>を実装していないため、IEnumerableのみのLINQオブジェクトを使用することはできません。代替Cast<DataRow>を使用することですが、私はEnumerableRowCollection<TRow>は、データテーブルで少しファンキーなことを行い信じる一方でそれは、Cast内で直接DataTableGetEnumeratorを使用するのと同じようにそれは微妙に違うだろうと

注意。場合によってはわずかなパフォーマンスの違いを除いて、実際の変更が表示されることはほとんどありません。

1

.AsEnumerable()拡張子だからIEnumerable<T>

するIEnumerable<T>を実装して何かをキャストするためだけの短手ですxsint[]であれば、あなたの代わりに(xs as IEnumerable<int>)xs.AsEnumerable()を呼び出すことができます。タイプ推論を使用して、xsのタイプを明示的に入力する必要がなくなります。

はここReflector.NETによって抽出されたコードです:

public static IEnumerable<TSource> AsEnumerable<TSource>(
    this IEnumerable<TSource> source) 
{ 
    return source; 
} 

しかし、私が思うに、この場合、私はジョンに同意する必要があります。おそらくSystem.Data.DataSetExtensionsアセンブリからのものです。