2009-06-13 102 views
1

我有实体类型Order,它具有对实体类型Customer的引用。 有一个函数导入根据条件返回Order的列表。此订单列表中显示的数据网格显示为如何在不使用EntityReference.Load()的情况下手动加载EntityReference()

Order.Date | Order.Customer.Name | Order.Total

For Customer.Name to show up我需要在列表中的每个订单中加载CustomerReference,但每次调用Order.CustomerReference.Load()都会往返SQL Server并使整个过程非常低效。问题是,如果我有一个查询为列表中的所有订单检索所有客户数据,那么如何在每个订单中手动填充CustomerReference?

基本上我需要做。包括(“客户”)与一个函数导入。

感谢

回答

2

如果执行带回所有相关客户一次性查询,也无需手动填充每个CustomerReference。这是因为所谓的关系修复会自动为你做这件事。

也就是说,如果你这样做:

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 

关系Fixup时意味着客户进入环境中的所有相关对象将自动为指向它...

即后这比你想象的要容易得多!

希望这有助于

亚历

-1

感谢亚历克斯,我试过了。它按照你所说的工作,但显然它不适用于派生实体类型。订单实体类型是一个具有派生类销售的抽象基类。

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 

而且我不能将函数导入返回类型设置为Order,因为它是抽象的,不允许作为返回类型。

我在这里错过了什么?

更新: 我发现有01之间的差异和S1客户加载 之前o1.CustomerReference.IsLoaded是假 o1.CustomerReference.EntityKey是ID = 2

s1.CustomerReference.IsLoaded是假 s1.CustomerReference.EntityKey为空

但调用s1.CustomerReference.Load()将正确加载客户数据。 我重复检查了我的GetSaleByCustomerID函数导入(简单地说“SELECT * FROM Customers WHERE ID = 2”),它确实返回了引用所需的CustomerID字段。

相关问题