首页 / C# / c# – 渴望加载加入
c# – 渴望加载加入
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 渴望加载加入,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2390字,纯文字阅读大概需要4分钟。
内容图文
![c# – 渴望加载加入](/upload/InfoBanner/zyjiaocheng/809/00ecd07afa0f4627b16714e4a0c78ca8.jpg)
我有一个查询,它连接两个在Entity Framework中没有已定义关系的表,并且连接表具有到第三个表的一对多导航属性.
msg和job之间存在一对多关系,但没有外键,并且.EDMX中没有定义关联.
作业和锁之间存在一对多关系,并且.EDMX中定义了关联,因此作业具有job.locks导航属性,而lock具有lock.job导航属性.
我的原始查询:
var msgsAndJobs = (
from m in dbContext.msgs
join j in dbContext.jobs
on new { jobid = m.jobid, priority = m.priority }
equals new { jobid = j.jobid, priority = j.priority }
where m.msgtype == "EMERGENCY"
orderby new { m.recvdt }
select new { m, j }
);
我发现EF正在为连接生成一个查询,然后执行第二个查询来为连接返回的每个记录填充导航属性.
微软的文档解释了这个问题:https://msdn.microsoft.com/en-us/data/jj574232.aspx
所以我认为我可以使用.Include()子句来急切地加载所涉及的记录.但它似乎没有工作:
我的新查询:
var msgsAndJobs = (
from m in dbContext.msgs
join j in dbContext.jobs.Include("locks")
on new { jobid = m.jobid, priority = m.priority }
equals new { jobid = j.jobid, priority = j.priority }
where m.msgtype == "EMERGENCY"
orderby new { m.recvdt }
select new { m, j }
);
它仍然为每个作业锁生成一个查询.
我有什么想法我做错了吗?
解决方法:
这就是Include的问题.使它无效是太容易了,并不总是清楚为什么它不起作用.打破Include的一件事是changing the shape of the query.另一件事是projecting to a non-entity type or an anonymous type.
这似乎令人难以置信地预测Include何时起作用和不起作用,但有一个简单的诀窍:如果在查询结束时应用它,则包含始终有效.
如果你不能在那里申请,那么无论如何都不会有效.
考虑到这一点,如果我们看一下你的情况,很清楚为什么Include不起作用.你做不到
(... select new { m, j }).Include("locks"); // Runtime error
因为lock显然不是匿名类型的导航属性.如果你使用lambda版本更明显:
(... select new { m, j }).Include(x => x.locks); // Doesn't compile
因此,您的Include无效,并且按需加载锁.
幸运的是,由于关系修正,存在一条出路,即EF通过其导航属性将实体编织在上下文中的过程.将您的查询更改为:
var msgsAndJobs = (
from m in dbContext.msgs
join j in dbContext.jobs
on new { jobid = m.jobid, priority = m.priority }
equals new { jobid = j.jobid, priority = j.priority }
where m.msgtype == "EMERGENCY"
orderby new { m.recvdt }
select new { m, j, j.locks }
).AsEnumerable()
.Select(x => new { x.m, x.j });
如果执行此查询,.AsEnumerable()会将结果加载到上下文中,之后您可以选择最初想要的结果.现在您将注意到EF已填充所有job.locks集合.
但重要的是:您必须禁用延迟加载,否则解决job.locks集合仍将触发延迟加载.这是因为,即使填充了集合,它也不会在内部标记为已加载.
内容总结
以上是互联网集市为您收集整理的c# – 渴望加载加入全部内容,希望文章能够帮你解决c# – 渴望加载加入所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。