我有一个实体类型Order,它引用了一个实体类型Customer。有一个函数import可以根据条件返回一个订单列表。此订单列表显示在数据网格中,该数据网格显示
Order.Date | Order.Customer.Name | Order.Total
为了显示Customer.Name,我需要按列表中的每个顺序加载CustomerReference,但每次调用Order.CustomerReference.Load()都会往返于SQL Server,从而使整个过程非常低效。问题是,如果我有一个查询检索列表中所有订单的所有客户数据,我如何手动填充每个订单中的CustomerReference?
基本上,我需要使用函数导入来执行.Include("Customer")。
谢谢
发布于 2009-06-13 22:30:34
如果执行一次返回所有相关客户的查询,则不需要手动填充每个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关系修复意味着在客户进入上下文后,所有相关对象都将自动指向它……
也就是说,这比你想象的要容易得多!
希望这能有所帮助
亚历克斯
发布于 2009-06-14 14:28:04
谢谢,Alex,我试过了。它可以像你说的那样工作,但显然它不能在派生实体类型上工作。订单实体类型是一个抽象基类,它有一个派生类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 我不能将函数导入返回类型设置为Order,因为它是抽象的,不允许作为返回类型。
这里我漏掉了什么?
更新:在加载客户之前,我发现o1和s1之间存在差异o1.CustomerReference.IsLoaded为False o1.CustomerReference.EntityKey为ID =2
s1.CustomerReference.IsLoaded为False s1.CustomerReference.EntityKey为null
但是调用s1.CustomerReference.Load()可以正确地加载客户数据。我仔细检查了我的GetSaleByCustomerID函数导入(简单地"SELECT * FROM Customers WHERE ID = 2"),它确实返回了引用所需的CustomerID字段。
https://stackoverflow.com/questions/990694
复制相似问题