[英]Difference between datatable.Rows.Cast<DataRow> and datatable.AsEnumerable() in Linq C#
我正在研究与数据相关的数据表相关操作,在数据表上使用linq的最有效方法是什么 -
var list = dataSet.Tables[0]
.AsEnumerable()
.Where(p => p.Field<String>("EmployeeName") == "Jams");
要么
var listobj = (EnumerableRowCollection<DataRow>) dataSet.Tables[0].Rows
.Cast<DataRow>()
.Where(dr => dr["EmployeeName"].ToString() == "Jams");
.AsEnumerable()
内部使用.Rows.Cast<DataRow>()
,至少在参考实现中 。 它还会执行其他一些操作,但不会对性能造成任何影响。
.AsEnumerable()
和.Field
做了很多未在大多数情况下,需要额外的工作。
此外,通过索引进行字段查找比按名称查找更快:
int columnIndex = dataTable.Columns["EmployeeName"].Ordinal;
var list = dataTable.Rows.Cast<DataRow>().Where(dr => "Jams".Equals(dr[columnIndex]));
对于多个名称,如果结果缓存在Dictionary
或Lookup
,则查找速度更快:
int colIndex = dataTable.Columns["EmployeeName"].Ordinal;
var lookup = dataTable.Rows.Cast<DataRow>().ToLookup(dr => dr[colIndex]?.ToString());
// .. and later when the result is needed:
var list = lookup["Jams"];
定义“有效”。
从性能的角度来看,我怀疑这两个选项之间存在任何显着差异:总体运行时间将由执行网络I / O所需的时间决定,而不是执行转换所需的时间。
从纯粹的代码风格来看,第二个看起来对我来说太不优雅了。 如果您可以使用全LINQ解决方案,那么请使用它,因为它通常(IMO,至少)因为声明性而更具可读性。
有趣的是, AsEnumerable()
返回EnumerableRowCollection<DataRow>
,如果您查看此代码,您将看到以下内容:
this._enumerableRows = Enumerable.Cast<TRow>((IEnumerable) table.Rows);
所以我会说它们基本相同!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.