对子集合的预测 - EF4

时间:2011-02-17 12:03:38

标签: linq entity-framework-4 linq-expressions

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

1 个答案:

答案 0 :(得分:0)

尝试

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