2011-04-16 73 views
2

我发布了一些关于在一个热切的加载查询中进行过滤的问题,我猜EF不支持在Include语句中进行过滤,所以我提出了这个问题。实体框架中的LINQ投影

我想执行一个简单的查询,其中通过sku编号获得ChildProdcut,并且它为PriceTiers筛选IsActive

Dim ChildProduct = ChildProductRepository.Query. 
      Where(Function(x) x.Sku = Sku). 
      Select(Function(x) New With { 
         .ChildProduct = x, 
         .PriceTiers = x.PriceTiers. 
         Where(Function(y) y.IsActive). 
         OrderBy(Function(y) y.QuantityStart) 
        }).Select(Function(x) x.ChildProduct).Single 

有没有更有效的方法呢?我在正确的轨道上?它确实有效。

我真的不明白的另一件事是为什么这个工作?你是否需要加载一个对象图,EF会接受它,并且看到这些集合属于ChildProduct,即使它们属于匿名类型?

此外,格式化长LINQ表达式的标准是什么?

回答

2

Is there a more efficient way of doing this? I am on the right track at all?

不,这是你在EF做到这一点的方式,是的,你是在正确的轨道上。

Another thing I really don't understand is why does this work?

这被认为是一个黑客位的,但它的作品,因为EF分析整个表达式,并生成一个查询(它看起来大致相同,如果你只是使用Include,但与PriceTiers集合已过滤)。因此,您得到的ChildProductsPriceTiers已填充(并正确过滤)。显然,您不需要匿名类的PriceTiers属性(只需选择x.ChildProduct即可丢弃它),但将其添加到LINQ查询中会告知EF将join和额外的where添加到生成的SQL中。因此,ChildProduct包含您所需要的一切。

0

如果此功能是criticalcal,请为其创建一个存储过程并链接实体框架。

+0

你会碰巧有这样的例子吗? – Sam 2011-04-17 04:25:26