我在热切的加载查询中发布了一些关于过滤的问题,我想EF不支持在Include
语句中进行过滤,所以我想出了这个。
我想执行一个简单的查询,其中获取ChildProdcut
个sku编号,并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表达式的标准是什么?
答案 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)
如果此功能至关重要,请创建存储过程并将实体框架链接到它。