我正在处理与数据相关的数据表相关操作,在数据表上使用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");
答案 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]));
对于多个名称,如果结果缓存在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"];
答案 2 :(得分:0)
定义“高效”。
从性能角度来看,我怀疑这两个选项之间是否存在任何显着差异:整体运行时间将由执行网络I / O所需的时间决定,而不是执行转换所需的时间。
从纯粹的代码风格来看,第二个看起来对我来说太不优雅了。如果您可以使用全LINQ解决方案,那么请使用它,因为它通常(IMO,至少)因为声明性而更具可读性。
答案 3 :(得分:0)
有趣的是,AsEnumerable()
返回EnumerableRowCollection<DataRow>
如果您查看此代码,您将看到以下内容:
this._enumerableRows = Enumerable.Cast<TRow>((IEnumerable) table.Rows);
所以我会说它们基本相同!