2015-08-28 9 views
5

pracuję nad samym elementu datatable powiązanej operacji na danych, co byłoby najbardziej efektywny sposób na wykorzystanie LINQ na datatable-Różnica między datatable.Rows.Cast <DataRow> i datatable.AsEnumerable() w LINQ C#

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

LUB

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

Odpowiedz

0

Określenie "skuteczny".

Z punktu widzenia wydajności wątpię, aby istniały znaczące różnice między tymi dwoma opcjami: całkowity czas pracy będzie zdominowany przez czas wymagany do wykonania operacji we/wy sieci, a nie czas wymagany do wykonania rzutowania.

Z punktu widzenia czystego stylu kodu, drugi wygląda dla mnie zbyt nieelegancko. Jeśli potrafisz uciec z rozwiązaniem LINQ, idź z nim jak zwykle (przynajmniej IMO) bardziej czytelnym z uwagi na deklaratywność.

0

Co ciekawe, AsEnumerable() powraca EnumerableRowCollection<DataRow> który jeśli spojrzeć na kod dla tego, będzie można zobaczyć następujące:

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

Więc chciałbym powiedzieć, że są one w zasadzie równoważne!

1

.AsEnumerable() używa wewnętrznie .Rows.Cast<DataRow>(), przynajmniej w wersji reference implementation. Wykonuje też kilka innych bitów, ale nic, co mogłoby znacząco wpłynąć na wydajność.

1

.AsEnumerable() i .Field wykonują dużo dodatkowej pracy, która w większości przypadków nie jest potrzebna.

Również wyszukiwanie pole o indeksie jest szybsze niż odnośnika przez nazwę:

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

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

Dla wielu nazw, odnośnika jest szybszy, jeśli wyniki są buforowane w Dictionary lub 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"]; 
Powiązane problemy