我正在尝试使用EF7(7.0.0-rc1-final),vNext RC1(rc1-final)和SQL Server 2014执行左外连接请求
数据库:
宠物:身份证,姓名
用户:Id,Name,#PetId
这个有效:
var queryWorks = from u in _context.Users
join p in _context.Pets on u.PetId equals p.Id into pp
from p in pp.DefaultIfEmpty()
select new {
UserName = u.Name,
Pet = p
};
但是这个不起作用(Message =“Sequence contains no elements”):
var queryFails = from u in _context.Users
join p in _context.Pets on u.PetId equals p.Id into pp
from p in pp.DefaultIfEmpty()
select new {
UserName = u.Name,
PetName = (p == null ? "NULL" : p.Name)
};
SQL Server Profile 2014向我显示第二个请求未发送到SQL Server。为什么?
答案 0 :(得分:3)
我认为这是你的第二个查询投影中的p.Name
未处理。
从RC1开始,EF7还不知道如何进行左外连接。简而言之,他们意识到要做到正确是非常重要的,他们正在努力。
github上的issue 3186报告了一些,并且一些开发者对它进行了评论。
我和另一位像你的人一样评论自己。
合作者“maumar”评论:
问题是在Linq(对象)中,LOJ的概念不存在 独自一人。
建议的修复方法是使用表示可选的导航 SelectMany-GroupJoin-DefaultIfEmpty组合然后折叠它 在我们的关系管道中进入LOJ模式。问题是这个 创建更复杂的查询(主要是由于引入 子查询)目前打破了大多数非平凡的案件。 在我们解决问题之前,需要解决这些错误 导航物业扩张。
我们确实认为这是一个高优先级的错误,因为它可能会返回 结果不正确。