2014-12-01 4 views
0

Я пытаюсь переписать следующий 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; 
} 

ответ

0

вы можете попробовать это решение? Я не уверен в результате :(

(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(); 
Смежные вопросы