Entity framework core 如何在EF Core v3中进行左外连接

Entity framework core 如何在EF Core v3中进行左外连接,entity-framework-core,ef-core-3.0,ef-core-3.1,Entity Framework Core,Ef Core 3.0,Ef Core 3.1,我一直在尝试使用GroupJoin语句对两个表进行左外部联接,这样我就可以得到表a中的行列表,而表B中没有任何项。但是,我一直得到一个异常 Exception found: Processing of the LINQ expression 'DbSet<People> .GroupJoin( outer: DbSet<RiskGroup>, inner: person => (Nullable<int&

我一直在尝试使用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. 

我正在尝试查找person表中所有在RiskGroup表中没有行的行。

我自己也在努力解决这个问题,我想看看这是否对您有帮助

好的,首先,我将保持这个简单。只要发现如果我们这样做,事情就容易多了 这是每个开发人员都会遇到的公司和地址

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

         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-不仅仅是公司,否则将不会出现左连接

     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();
试试看你是否得到了你需要的

 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();