实体框架中的LINQ投影

时间:2011-04-16 05:40:24

标签: linq entity-framework lambda

我在热切的加载查询中发布了一些关于过滤的问题,我想EF不支持在Include语句中进行过滤,所以我想出了这个。

我想执行一个简单的查询,其中获取ChildProdcut个sku编号,并PriceTiersIsActive过滤。

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 个答案:

答案 0 :(得分: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 1}}收集过滤)。因此,您将ChildProducts填充PriceTiers(并正确过滤)。显然,您不需要匿名类的PriceTiers属性(只需选择x.ChildProduct即可丢弃它),但将其添加到LINQ查询会告知EF添加join和生成的SQL的额外where。因此,ChildProduct包含您所需要的一切。

答案 1 :(得分:0)

如果此功能至关重要,请创建存储过程并将实体框架链接到它。