首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何不使用EntityReference.Load()手动加载EntityReference

如何不使用EntityReference.Load()手动加载EntityReference
EN

Stack Overflow用户
提问于 2009-06-13 13:43:07
回答 2查看 1.1K关注 0票数 1

我有一个实体类型Order,它引用了一个实体类型Customer。有一个函数import可以根据条件返回一个订单列表。此订单列表显示在数据网格中,该数据网格显示

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

为了显示Customer.Name,我需要按列表中的每个顺序加载CustomerReference,但每次调用Order.CustomerReference.Load()都会往返于SQL Server,从而使整个过程非常低效。问题是,如果我有一个查询检索列表中所有订单的所有客户数据,我如何手动填充每个订单中的CustomerReference?

基本上,我需要使用函数导入来执行.Include("Customer")。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2009-06-13 22:30:34

如果执行一次返回所有相关客户的查询,则不需要手动填充每个CustomerReference。这是因为一种叫做关系修正的东西会自动为你做这件事。

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

代码语言:javascript
复制
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

关系修复意味着在客户进入上下文后,所有相关对象都将自动指向它……

也就是说,这比你想象的要容易得多!

希望这能有所帮助

亚历克斯

票数 2
EN

Stack Overflow用户

发布于 2009-06-14 14:28:04

谢谢,Alex,我试过了。它可以像你说的那样工作,但显然它不能在派生实体类型上工作。订单实体类型是一个抽象基类,它有一个派生类Sale。

代码语言:javascript
复制
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字段。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/990694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档