2010-04-01 76 views
3

這工作:爲什麼EnumerableRowCollection <DataRow> .Select()這樣編譯?

from x in table.AsEnumerable() 
where x.Field<string>("something") == "value" 
select x.Field<decimal>("decimalfield"); 

,但是,這並不:

from x in table.AsEnumerable() 
.Where(y=>y.Field<string>("something") == "value") 
.Select(y=>y.Field<decimal>("decimalfield")); 

我也試過:

from x in table.AsEnumerable() 
.Where(y=>y.Field<string>("something") == "value") 
.Select(y=>new { name = y.Field<decimal>("decimalfield") }); 

望着。選擇的兩個重載()方法,我認爲後兩者都應該返回EnumerableRowCollection,但顯然我錯了。我錯過了什麼?

回答

3

問題是你要結合執行LINQ查詢(查詢語法和直接調用LINQ擴展方法)兩種方式。行from x in table.AsEnumerable()不是有效的查詢,因爲它至少需要select ...。這應該工作:

table.AsEnumerable() 
.Where(y=>y.Field<string>("something") == "value") 
.Select(y=>new { name = y.Field<decimal>("decimalfield") }); 
+0

只需添加到這...你正在過濾'x'的表格,但沒有爲它選擇任何東西......你可以保持相同的語法,只需添加'選擇x'最後。 – Edyn 2012-07-31 15:51:53

0

也許問題出在別的地方。這將編譯就好:

using System.Data; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var dt = new DataTable(); 

     var res = from x in dt.AsEnumerable() 
        where x.Field<string>("something") == "value" 
        select x.Field<decimal>("decimalfield"); 

     var res2 = dt.AsEnumerable() 
      .Where(y => y.Field<string>("something") == "value") 
      .Select(y => y.Field<decimal>("decimalfield")); 
    } 
} 
+0

你res2是不相同的我的。李的答案是解決方案。在後兩個例子中使用方法語法時,我錯誤地使用了「from x」。其中,巧合的是,你沒有:) – 2010-04-01 14:03:52