【发布时间】:2015-10-05 18:42:08
【问题描述】:
我有一个查询,它连接两个在 Entity Framework 中没有定义关系的表,并且连接的表与第三个表具有一对多的导航属性。
msg 和 job 之间存在一对多关系,但没有外键,也没有在 .EDMX 中定义关联。
job和lock是一对多的关系,在.EDMX中定义了关联,所以job有job.locks导航属性m,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 }
);
它仍在为每个作业锁生成一个查询。
任何想法我做错了什么?
【问题讨论】:
-
using System.Data.Entity;将增加对Include的 lambda 表达式重载的支持 -
这让 lambda 表达式正常工作,但查询仍然是延迟加载...
-
您是否尝试过仅对没有包含的锁进行投影甚至更好...手动将您的连接添加到锁?
标签: c# sql-server entity-framework lazy-loading