gpt4 book ai didi

c# - 如何在 EF 4.1 中急切加载祖 parent 记录

转载 作者:行者123 更新时间:2023-11-30 16:27:06 25 4
gpt4 key购买 nike

我正在使用 EF4.1 并试图了解为预加载采取的正确方法。我有一个带有供应商(祖 parent )、采购订单(父)和 PO2Item(子)表的订单输入系统。模型看起来像这样 ModelScreenImage

我想从 PO2Item 记录开始并加载供应商。我想我可以像这样使用 .Include() :

var po = (from item in context.PO2Item.Include("PurchaseOrder.Vendor").AsNoTracking()
where item.OrderLineItemId == lineItem.CostSourceLineItemId
select item.PurchaseOrder).FirstOrDefault();

这会加载 PurchaseOrder 记录,但 po.Vendor 为空。我正在阅读 Julia Lerman 的书,第 4 章指出我可以使用 Load,但我认为 4.1 一定已经从 4.0 改变了这一点,因为 Load 似乎没有定义并且没有 VendorReference 这样的东西。最终我深入研究了 ObjectContext 并能够做到这一点:

   if (po!=null)
{
context.GetObjectContext().LoadProperty(po, "Vendor");
}

它确实加载了供应商,但我觉得我错过了一些更简单的东西。为什么 Include("PurchaseOrder.Vendor") 不起作用?

根据克雷格的回答更新。

我没有将结果转换为 ObjectQuery<>(这本身就是一个很酷的小技巧),而是分两个阶段编写了查询

var links = from link in context.PO2Item.Include("PurchaseOrder.Vendor").AsNoTracking()
where link.OrderLineItemId == lineItem.CostSourceLineItemId
select link;

var po_2_item = links.FirstOrDefault();
return po_2_item == null ? null : po_2_item.PurchaseOrder;

返回的采购订单(如果存在)现在已正确设置供应商。

参见this answer以获得更优雅的解决方案。

最佳答案

.Include() 作用于返回查询的形状。

您的查询返回一个 PurchaseOrder,而不是一个 PO2Item

你需要更像的东西(猜测这里的类型——你可能正在使用 DbSet——相应地调整):

var po = ((ObjectQuery<PurchaseOrder>)
(from item in context.PO2Item
where item.OrderLineItemId == lineItem.CostSourceLineItemId
select item.PurchaseOrder))
.Include("Vendor")
.AsNoTracking()
.FirstOrDefault();

关于c# - 如何在 EF 4.1 中急切加载祖 parent 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8174961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com