2015-08-28 46 views
5

我對數據相同的數據表相關的操作工作,datatable.Rows.Cast 和datatable.AsEnumerable()之間的區別是什麼將使用LINQ上datatable- Linq中的C#

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

回答

0

定義「高效」。

從性能角度來看,我懷疑這兩個選項之間是否存在顯着差異:整體運行時間將由執行網絡I/O所需的時間來控制,而不是執行強制轉換所需的時間。

從純代碼風格的角度來看,第二個看起來對我來說太不講究。如果你可以用全LINQ解決方案逃避責任,那麼通過(因爲它是聲明性的)通常(IMO,至少)更易讀。

0

有趣的是,AsEnumerable()返回EnumerableRowCollection<DataRow> 它,如果你看看這個代碼,你會看到以下內容:

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

所以,我要說,他們基本上是相等的!

1

.AsEnumerable()內部使用.Rows.Cast<DataRow>(),至少在reference implementation。它也做了其他一些比特,但沒有任何會顯着影響性能。

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