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
的意义是什么?如果.NET Framework中不存在AsEnumerable
,那么开发人员执行上述任务的方法是什么?
答案 0 :(得分:3)
假设我正确地解释它,它正在调用DataTableExtensions.AsEnumerable()
。没有它(或类似的东西),你不能使用LINQ to Objects,因为DataTable
没有实现IEnumerable<T>
,只有IEnumerable
。
请注意,另一种方法是使用Cast<DataRow>
,但这会略有不同,因为DataTable
直接使用GetEnumerator
的{{1}},而我Cast
相信EnumerableRowCollection<TRow>
使用数据表做一些更时髦的事情。它不太可能出现任何真正的变化,除了可能会有轻微的性能差异。
答案 1 :(得分: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
汇编。