2011-09-29 2 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(). Без этого (или что-то подобное) вы не можете использовать LINQ to Objects, поскольку DataTable не реализует IEnumerable<T>, только IEnumerable.

Обратите внимание, что альтернативой было бы использовать Cast<DataRow>, но это было бы немного отличается, как бы использовать DataTable «s GetEnumerator непосредственно в Cast, в то время как я считаю, EnumerableRowCollection<TRow> делает немного более фанки вещи с таблицей данных. Это вряд ли может показаться реальными изменениями, за исключением, возможно, небольшой разницы в производительности.

1

.AsEnumerable() расширение только стенография для литья то, что реализует IEnumerable<T> быть IEnumerable<T>

Так что, если xs является int[], вы можете позвонить xs.AsEnumerable() вместо (xs as IEnumerable<int>). Он использует вывод типа, чтобы избежать необходимости явно вводить тип xs.

Вот код извлекается Reflector.NET:

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

Но в данном случае я думаю, что я должен согласиться с Джоном. Это, вероятно, из сборки System.Data.DataSetExtensions.