2011-02-17 57 views
1

讓我們假設用EF4以下模型:預測過子集 - EF4

class Order 
{ 
    .... 
    public int Id {get;private set;} 

    //ICollection is the root of all evil here 
    public ICollection<OrderDetail> Details {get;private set;} 
} 

我可以再項目在該結構上使用LINQ:

var IdAndCount = context 
    .Orders 
    .Select (o => new { 
      Id = o.Id, 
      Count = o.Details.Where(d => d.Foo > 0).Count()}); 

到目前爲止好,這將是完全翻譯成sql。

我們的問題,如果我想提取在此查詢的WHERE子句謂詞什麼:

Func<OrderDetail,bool> detailPredicate = d => d.Foo > 0; 

var IdAndCount = context 
    .Orders 
    .Select (o => new { 
     Id = o.Id, 
     Count = o.Details 
        .Where(detailPredicate) 
        .Count()}); 

這將編譯,但在運行時失敗,因爲沒有辦法爲EF4翻譯的謂詞SQL因爲它是一個Func而不是一個表達式。

將謂詞更改爲Expression<Func<OrderDetail,bool>>將不起作用,因爲細節爲ICollection,因此OrderDetails上的「.Where」鏈接到IEnumerable「Where」。

那麼,如果遍歷的屬性是IEnumerable或者相似的,是否有可能提取更大的Linq查詢的一部分?

回答

0

嘗試

Expression<Func<OrderDetail,bool>> detailPredicate = d => d.Foo > 0; 
+0

因爲訂單明細這將無法正常工作是一個ICollection的和地方上的ICollection子句使用函數功能,而不是表達 2011-02-17 12:24:17