我正在尝试使用 Entity Framework 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;
}
这是我得到的以下编译器错误:
无法从用法中推断出类型参数。尝试明确指定类型参数。
简而言之:我需要在连接中使用多个列,将通过 Entity Framework 提供的两个DbSet对象进行OUTER JOIN 。
我也相当确定这不会正确执行LEFT OUTER JOIN,即使我没有收到编译器错误;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;
}