2015-08-28 8 views
5

Sto lavorando su stessa operazione relativa DataTable sui dati, quale sarebbe il modo più efficiente di utilizzare LINQ su datatable-Differenza tra datatable.Rows.Cast <DataRow> e datatable.AsEnumerable() in LINQ C#

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

O

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

risposta

0

Definire "efficiente".

Dal punto di vista delle prestazioni, dubito che ci siano differenze significative tra queste due opzioni: il tempo di esecuzione complessivo sarà dominato dal tempo necessario per eseguire I/O di rete, non il tempo necessario per eseguire il casting.

Dal punto di vista dello stile di codice puro, il secondo sembra troppo poco elegante per me. Se riesci a farla franca con la soluzione all-LINQ, segui la procedura generalmente (IMO, almeno) più leggibile in quanto dichiarativa.

0

Abbastanza interessante, AsEnumerable() rendimenti EnumerableRowCollection<DataRow> che se si guarda nel codice per questo, si vedrà il seguente:

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

Quindi direi che sono sostanzialmente equivalenti!

1

.AsEnumerable() utilizza internamente .Rows.Cast<DataRow>(), almeno nello reference implementation. Fa anche qualche altro bit, ma nulla che possa influenzare sensibilmente le prestazioni.

1

.AsEnumerable() e .Field fare un sacco di lavoro extra che non è necessario nella maggior parte dei casi.

Inoltre, campo di ricerca per indice è più veloce di ricerca per nome:

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

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

Per più nomi, la ricerca è più veloce se i risultati vengono memorizzati nella cache in un Dictionary o 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"];