【问题标题】:Left Outer Join with Entity Framework Core使用 Entity Framework Core 的左外连接
【发布时间】:2015-12-04 18:28:01
【问题描述】:

我正在尝试使用 EF7 (7.0.0-rc1-final)、vNext RC1 (rc1-final) 和 SQL Server 2014 执行左外连接请求

数据库:

宠物:身份证、姓名

用户:ID、姓名、#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。为什么?

【问题讨论】:

  • 此问题最近已得到修复 - 问题是 EF 对使用 DefaultIfEmpty 的查询做出了一些不正确的假设,如果想在 DIE() 调用之上编写任何内容,EF 会抛出。此修复程序将在下一个版本或夜间版本中提供。

标签: c# entity-framework-core


【解决方案1】:

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

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

在 github 上issue 3186 被报道,一些开发者对此发表了评论。

我用另一个和你有点像的复制品评论了自己。

合作者“maumar”评论:

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

建议的修复是使用表示可选导航 SelectMany-GroupJoin-DefaultIfEmpty 组合然后折叠这个 模式到我们的关系管道中的 LOJ。问题是这个 创建更复杂的查询(主要是由于引入 子查询)并且目前在大多数非平凡情况下都中断。 这些错误需要先解决,然后我们才能解决问题 导航属性扩展。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多