1

让我们假设使用 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 查询的一部分?

4

1 回答 1

0

尝试

Expression<Func<OrderDetail,bool>> detailPredicate = d => d.Foo > 0;
于 2011-02-17T12:06:35.290 回答