左外连接实体框架核心

时间:2015-12-04 18:28:02

标签: 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 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。为什么?

1 个答案:

答案 0 :(得分:3)

我认为这是你的第二个查询投影中的p.Name未处理。

从RC1开始,EF7还不知道如何进行左外连接。简而言之,他们意识到要做到正确是非常重要的,他们正在努力。

github上的issue 3186报告了一些,并且一些开发者对它进行了评论。

我和另一位像你的人一样评论自己。

合作者“maumar”评论:

  

问题是在Linq(对象)中,LOJ的概念不存在   独自一人。

     

建议的修复方法是使用表示可选的导航   SelectMany-GroupJoin-DefaultIfEmpty组合然后折叠它   在我们的关系管道中进入LOJ模式。问题是这个   创建更复杂的查询(主要是由于引入   子查询)目前打破了大多数非平凡的案件。   在我们解决问题之前,需要解决这些错误   导航物业扩张。

     

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