实体框架 6 - 外部联接和方法语法查询

本文关键字:方法 语法 查询 框架 外部 实体 | 更新日期: 2023-09-27 18:32:34

我正在尝试使用实体框架 6 重写以下 SQL LEFT OUTER JOIN 查询:

select tblA.*, tblB.*
from dbo.TableA tblA left outer join dbo.TableB tblB on 
    tblA.Student_id=tblB.StudentId and tblA.other_id=tblB.OtherId
where tblB.Id is null

这是我当前的 C# 代码:

using (var db = EFClass.CreateNewInstance())
{
    var results = db.TableA.GroupJoin(
        db.TableB,
        tblA => new { StudentId = tblA.Student_id, OtherId = tblA.other_id },
        tblB => new { tblB.StudentId, tblB.OtherId },
        (tblA, tblB) => new { TableAData = tblA, TableBData = tblB }
    )
    .Where(x => x.TableBData.Id == null)
    .AsNoTracking()
    .ToList();
    return results;
}

这是我得到的以下编译器错误:

无法从用法中推断出类型参数。尝试指定 显式类型参数。

简而言之:我需要在连接中使用多个列来外部联接通过实体框架提供的两个 DbSet 对象。

我也相当确定这不会正确地执行左外部连接,即使我没有收到编译器错误;我怀疑我需要以某种方式在某个地方涉及DefaultIfEmpty()方法。如果你也能帮我解决这个问题,那就加分了。

更新#1:如果我在连接中使用强类型,它可以工作...是根本无法处理匿名类型,还是我做错了什么?

public class StudentOther
{
    public int StudentId { get; set; }
    public int OtherId { get; set; }
}
using (var db = EFClass.CreateNewInstance())
{
    var results = db.TableA.GroupJoin(
        db.TableB,
        tblA => new StudentOther { StudentId = tblA.Student_id, OtherId = tblA.other_id },
        tblB => new StudentOther { StudentId = tblB.StudentId, OtherId = tblB.OtherId },
        (tblA, tblB) => new { TableAData = tblA, TableBData = tblB }
    )
    .Where(x => x.TableBData.Id == null)
    .AsNoTracking()
    .ToList();
    return results;
}

实体框架 6 - 外部联接和方法语法查询

你能试试这个解决方案吗?我不确定结果:(

(from tblA in dbo.TableA
join tblB in dbo.TableB on new { tblA.Student_id, tblA.other_id } equals new { blB.StudentId, tblB.OtherId }
into tblBJoined
from tblBResult in tblBJoined.DefaultIfEmpty()
where tblBResult.Id == null
select new {
    TableAData = tblA,
    TableBData = tblB
}).ToList();