让我们假设以下模型使用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。
将谓词更改为Expression<Func<OrderDetail,bool>>
将不起作用,因为OrderDetails上的“.Where”链接到IEnumerable“Where”,因为详细信息是ICollection。
那么,如果遍历的属性是IEnumerable还是similair,是否有可能提取更大的Linq查询的部分?
答案 0 :(得分:0)
尝试
Expression<Func<OrderDetail,bool>> detailPredicate = d => d.Foo > 0;