实体框架4:使用自我跟踪实体的过滤器进行预先加载(包括)

Mar*_*ins 8 .net linq sql-server ado.net entity-framework-4

我有一个解决方案,我使用RTM模板创建了自我跟踪实体.我已经在两个项目之间拆分了实体和上下文,以便我可以重用类型定义,因为我计划通过WCF运行客户端/服务器.

我的一个服务方法需要返回具有"ProductSku"子对象的"Product"对象的图形,这些对象又具有"ProductPrice"的子对象.选择标准将位于"Product"对象的"Name"属性和"ProductPriceObject"的"FinancialPeriodID"属性中.目前,我没有在搜索中包含该名称,但我在恢复图表方面遇到了问题.

如果我只是执行以下查询(请注意,此语法取自LinqPad而不是实际的应用程序代码)...

from product in Products.Include("Skus.PriceHistory")
select product
Run Code Online (Sandbox Code Playgroud)

...然后我能够检索我需要的项目的完整对象图,当然此时没有过滤器.

如果相反,我引入过滤器如下...

from product in Products.Include("Skus.PriceHistory")
join sku in ProductSkus on product.ID equals sku.ProductID
join price in ProductPrices on sku.ID equals price.ProductSkuID
where price.FinancialPeriodID == 244
select product
Run Code Online (Sandbox Code Playgroud)

...我期待得到的是"Product"对象,子"ProductSku"对象(位于"Product"的"Skus"集合中)和它们的"ProductPrice"对象(位于" PriceHistory"ProductSku"的集合 - 但我只收回"Product"对象,"Skus"集合是空的.

我也尝试将查询编码为......

from product in Products.Include("Skus.PriceHistory")
from sku in product.Skus
from price in sku.PriceHistory
where price.FinancialPeriodID == 244
select product
Run Code Online (Sandbox Code Playgroud)

......但这也没什么区别.

显然,我必须做错事.任何人都可以了解那些东西,因为我已经在这里玩了几个小时现在绕圈子!

Lad*_*nka 1

编辑:

关于什么:

from product in Products.Include("Skus.PriceHistory")
where product.Skus.Any(s => s.PriceHistory.Any(p => p.FinancialPeriodID == 244))
select product
Run Code Online (Sandbox Code Playgroud)

Include已经执行了所有必要的任务来填充导航属性,因此不需要附加条件的连接。更重要的是,任何手动连接或投影都会改变查询的形状,并且Include不会被使用。

另请注意,where 条件仅过滤产品。它不会过滤“包含”加载的数据 - 您将获得至少有一个 sku 具有财务周期 id 244 的价格历史记录的所有产品,但这些产品将加载所有 sku 和价格历史记录。EF 目前不支持对包含进行过滤。如果您还需要过滤关系,则必须执行单独的查询才能获取它们。