2012-02-29 23 views
9

Bir DataTable ile çalışıyordum ve Resharper'ın bir döngüyi LINQ ifadesine dönüştürebileceğimi önerdiğini fark ettim. Öyle yaptım ve (basitleştirilmiş) sorgu ifade söz diziminde yeniden yazıldı:LINQ - Yöntem vs Sorgu Sözdizimi Farkı

var test1 = from DataRow row in dt.Rows select row; 

Şahsen, yöntem sözdizimi yüzden bu kadar yeniden yazdım tercih:

var test2 = dt.Rows.Select(row => row); 

Ve kırdı.

'System.Data.DataRowCollection' 'Seç' tanımını ve türü 'System.Data.DataRowCollection' bir ilk argüman kabul hiç uzatma yöntemi 'Seç' içermiyor (eğer eksik bulunamadı kullanma yönergesi veya derleme başvurusu?)

Sorgu ifadesi translated to method calls olduğundan, neden bu ilk çalışmadır, ancak ikinci değil mi? İkisinden de beklenmedik ya da işe yaramadı.

cevap

12

ilk olarak bir açık daktilo aralık değişkeni vardır, bu yüzden aslında hiç derlenmiş:

var test2 = dt.Rows.Cast<DataRow>(); 

(bu kadar Select gerek bir dejenere sorgu ifadesi (belirli bir no-op olan var mi .)

alternatif DataTableExtensions den AsEnumerable çağırmaktır ama sadece bazı durumlarda, ki bazı performans faydaları olabilir inanıyoruz.

var test2 = dt.AsEnumerable(); 
+2

'DataRowCollection' IEnumerable 'değil' IEnumerable'ı uyguladığı için gereklidir. –

+1

@ChrisShouts: Ah, bunu daha önce fark etmiştim ama tam olarak neden tam olarak dalmıştı. "Yanlış" IEnumerable uyguladığı gerçeği, eksik olduğum şey. :) – Chris