【问题标题】:How do I do an Left Outer Join in EF Core v3如何在 EF Core v3 中进行左外连接
【发布时间】:2020-02-21 15:12:37
【问题描述】:

我一直在尝试使用 GroupJoin 语句对两个表进行左外连接,以便我可以获得表 A 中没有表 B 中任何项目的行列表。但是我不断收到异常

  Exception found: Processing of the LINQ expression 'DbSet<People>
      .GroupJoin(
          outer: DbSet<RiskGroup>,
          inner: person => (Nullable<int>)person.Id,
          outerKeySelector: risk => risk.AssessorId,
          innerKeySelector: (person, risks) => new {
              person = person,
              risks = risks
                  .DefaultIfEmpty()
           })' by 'NavigationExpandingExpressionVisitor' failed. 

这似乎暗示在 EF Core v3 中是不可能的。有谁知道如何解决这个问题或者我的 LINQ 不正确:

    var Ids = destContext.People.GroupJoin(destContext.RiskGroup,
        person => person.Id,
        risk => risk.AssessorId,
        (person, risks) => new { person, risks = risks.DefaultIfEmpty() }).ToList();

我试图在 person 表中找到所有在 RiskGroup 表中没有行的行。

【问题讨论】:

    标签: entity-framework-core ef-core-3.0 ef-core-3.1


    【解决方案1】:

    我自己也遇到过这个问题,我想看看这对你有没有帮助

    对于初学者来说,我将保持简单。如果我们这样做,就会发现事情会更容易 这是每个开发人员都会遇到的公司和地址

    第一个表(公司)是我们可以有多个记录的表 第二个表(地址)我们有一条记录

             company => company.AddressId,
             address => address.AddressId,
    

    所以我们使用地址的addressId查询,我一直使用tableNameId,这样更容易阅读

    因此,对于 GroupJoin,您现在需要输出以便稍后在查询中使用。

    (company, address) = new (company, address) 
    

    现在你需要一个 SelectMany - 这就是搞砸每个人的原因 您需要记录公司何时为空

     s.address.DefaultIfEmpty(),
    

    以及 SelectMany 的输出

     (s, address) => new { company = s.company, address });
    

    注意,非常重要 - 公司必须是 s.company - 不仅仅是公司,否则 LEFT JOIN 将不会出现。

         var a = context.Companys.GroupJoin(context.Addresses,
                 company => company.AddressId,
                 address => address.AddressId,
                 (company, address) => new { company, address })
                 .SelectMany(s => s.address.DefaultIfEmpty(),
                            (s, address) => new { company = s.company, address });
        var outA = a.ToList();
    

    针对您的具体问题

     var a = destContext.People.GroupJoin(destContext.RiskGroup,
                 person => person.Id,
                 risk => risk.AssessorId,
                 (person, risk) => new { person, risk })
                 .SelectMany(s => s.risk.DefaultIfEmpty(),
                            (s, risk) => new { person = s.person, risk })
                 .Where(x => x.AssesorId == null);
            var outA = a.ToList();
    

    尝试一下,看看你是否得到了你需要的东西

    【讨论】:

      猜你喜欢
      • 2018-07-09
      • 1970-01-01
      • 2017-12-21
      • 2021-05-06
      • 1970-01-01
      • 2017-03-18
      • 2019-07-26
      • 1970-01-01
      • 2015-04-13
      相关资源
      最近更新 更多