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查詢的一部分?
因爲訂單明細這將無法正常工作是一個ICollection的和地方上的ICollection子句使用函數功能,而不是表達
2011-02-17 12:24:17