让我们假设使用 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 而不是表达式。
将谓词更改为 anExpression<Func<OrderDetail,bool>>
将不起作用,因为 OrderDetails 上的“.Where”链接到 IEnumerable“Where”,因为详细信息是 ICollection。
那么,如果遍历的属性是 IEnumerable 或类似的,是否可以提取更大的 Linq 查询的一部分?