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 を介して使用可能になった 2 つの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;
}