Я пытаюсь переписать следующий SQL LEFT OUTER JOIN запроса с использованием Entity Framework 6:Entity Framework 6 - Внешние соединения и метод Синтаксис запросы
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;
}
И вот следующая ошибка компилятора я получаю:
аргументы типа не может быть выведено из использования. Попробуйте указать явно аргументы типа .
В двух словах: мне нужно OUTER JOIN два DbSet объекты доступны через Entity Framework, используя более одного столбца в соединении.
Я также уверен, что это не сделает LEFT OUTER JOIN должным образом, даже если я не получил ошибку компилятора; Я подозреваю, что мне нужно каким-то образом связать метод DefaultIfEmpty()
. Бонусные очки, если вы тоже можете мне помочь.
UPDATE # 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;
}