C# 具有实体框架核心的左外部联接

C# 具有实体框架核心的左外部联接,c#,entity-framework-core,C#,Entity Framework Core,我正在尝试使用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

我正在尝试使用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”):


SQL Server Profile 2014向我显示第二个请求未发送到SQL Server。为什么?

我想是你的
p.Name
在第二个查询的投影中没有被处理

到RC1为止,EF7还不知道如何进行左外连接。简言之,他们意识到纠正错误是一件非常重要的事情,他们正在努力

在github上有报道,一些开发人员对此发表了评论

我用另一个有点像你的责备来评论我自己

合作者“maumar”备注:

问题是在Linq(对象)中,LOJ的概念并不存在 靠自己

建议的修复方法是使用 选择Many GroupJoin DefaultIfEmpty组合,然后将其折叠 在我们的关系管道中将模式转换为LOJ。问题是这个 创建更复杂的查询(主要是由于引入了 子查询)和当前大多数非平凡情况下的中断。 我们需要先解决这些bug,然后才能用 导航属性扩展

我们认为这是一个高优先级的bug,因为它可能会返回 结果不正确


这个问题最近已经解决了——问题是EF对使用DefaultIfEmpty的查询做出了一些错误的假设,如果想要在DIE()调用之上编写任何东西,EF会抛出。此修复程序将在下一版本或夜间版本中提供。
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)
                 };