2014-12-01 94 views
0

我试图重新写了下面的SQL LEFT OUTER使用实体框架6 JOIN查询:实体框架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对象通过实体框架可用,在连接使用多列。

我也很确定这不会做正确的左外部连接,即使我没有收到编译器错误;我怀疑我需要在某个地方以某种方式涉及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; 
} 

回答

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