我有实体类型Order,它引用了一个实体类型Customer。 有一个函数导入,它根据条件返回Order列表。这个订单列表显示在Datagrid中,显示
Order.Date | Order.Customer.Name | Order.Total
要显示Customer.Name,我需要在列表中的每个Order中加载CustomerReference,但每次调用Order.CustomerReference.Load()都会进行SQL Server往返并使整个过程效率非常低。问题是,如果我有一个查询检索列表中所有订单的所有客户数据,如何在每个订单中手动填充CustomerReference?
基本上我需要使用函数import .Include(“Customer”)。
由于
答案 0 :(得分:2)
如果您执行一次性回收所有相关客户的查询,则无需手动填充每个CustomerReference。这是因为一个名为Relationship Fixup的东西会自动为你做这件事。
即。如果你这样做:
Order o = ctx.Orders.First(o => o.Customer.ID == 1);
// at this point o.Customer == null
Customer c = ctx.Customers.First(c => c.ID == 1);
// at this point o.Customer == c
关系修复意味着在客户输入上下文后,所有相关对象现在将自动指向它...
即。这比你想象的容易得多!
希望这有帮助
亚历
答案 1 :(得分:-1)
谢谢Alex,我试过了。它按照你的说法工作,但显然它不适用于派生实体类型。 Order Entity Type是一个抽象基类,它有一个派生类Sale。
Order o1 = ctx.Orders.First(o => o.Customer.ID == 1);
Sale s1 = ctx.GetSaleByCustomerID_FunctionImport(2).First();
Customer c = ctx.Customers.First(c => c.ID == 1);
Customer c2 = ctx.Customers.First(c => c.ID == 2);
//At this point o.Customer == c but s1.Customer is still null
我不能将函数import return类型设置为Order,因为它是抽象的,不允许作为返回类型。
我在这里缺少什么?
更新: 在客户加载之前我发现o1和s1之间存在差异 o1.CustomerReference.IsLoaded是假的 o1.CustomerReference.EntityKey是ID = 2
s1.CustomerReference.IsLoaded为False s1.CustomerReference.EntityKey为null
但是调用s1.CustomerReference.Load()会正确加载Customer数据。 我仔细检查了我的GetSaleByCustomerID函数导入(只是“SELECT * FROM Customers WHERE ID = 2”),它确实返回了引用所需的CustomerID字段。