Linq C中datatable.Rows.Cast <datarow>和datatable.AsEnumerable()之间的区别#

时间:2015-08-28 10:08:06

标签: c# linq

我正在处理与数据相关的数据表相关操作,在数据表上使用linq的最有效方法是什么 -

var list = dataSet.Tables[0]
  .AsEnumerable()
  .Where(p => p.Field<String>("EmployeeName") == "Jams");

OR

var listobj =  (EnumerableRowCollection<DataRow>) dataSet.Tables[0].Rows
  .Cast<DataRow>()
  .Where(dr => dr["EmployeeName"].ToString() == "Jams");

4 个答案:

答案 0 :(得分:1)

.AsEnumerable()内部使用.Rows.Cast<DataRow>(),至少在reference implementation。它还会执行其他一些操作,但不会对性能造成任何影响。

答案 1 :(得分:1)

.AsEnumerable().Field做了很多额外的工作,在大多数情况下都不需要。

此外,按索引进行字段查找比按名称查找更快:

int columnIndex = dataTable.Columns["EmployeeName"].Ordinal;

var list = dataTable.Rows.Cast<DataRow>().Where(dr => "Jams".Equals(dr[columnIndex])); 

对于多个名称,如果结果缓存在DictionaryLookup中,则查找速度会更快:

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"];

答案 2 :(得分:0)

定义“高效”。

从性能角度来看,我怀疑这两个选项之间是否存在任何显着差异:整体运行时间将由执行网络I / O所需的时间决定,而不是执行转换所需的时间。

从纯粹的代码风格来看,第二个看起来对我来说太不优雅了。如果您可以使用全LINQ解决方案,那么请使用它,因为它通常(IMO,至少)因为声明性而更具可读性。

答案 3 :(得分:0)

有趣的是,AsEnumerable()返回EnumerableRowCollection<DataRow> 如果您查看此代码,您将看到以下内容:

this._enumerableRows = Enumerable.Cast<TRow>((IEnumerable) table.Rows);

所以我会说它们基本相同!