0

tl; drバージョン:linq to EFを使用するには、このSQLステートメントが必要です

これはSQLのクエリです。

select 
stu.SyStudentId, 
rtrim(stu.StuNum) as StudentNumber, 
stu.SSN,
stu.FirstName, 
stu.LastName, 
Email, 
OtherEmail, 
stu.StartDate,
case 
when (systa.category = 'E') then 'Enrolled'  
    when (systa.category = 'A') then 'Active'  
    else 'This should never happen'
end as StatusCategory,
rtrim(schsta.Code) as SchoolStatusCode,
pic.StudentPicture,
case when (stu.DateLstMod > isnull(pic.DateLstMod,'1900-1-1')) 
then stu.DateLstMod 
    else pic.DateLstMod 
end as DateLstMod
from 
SyStudent stu
inner join syschoolstatus schsta on schsta.syschoolstatusid = stu.syschoolstatusid
inner join SyStatus systa on systa.SyStatusId = schsta.SyStatusId
left outer join cmstudentpicture pic on pic.systudentid = stu.systudentid
where stu.sycampusid = 6
and systa.category in ('E','A')

古いシステムから継承された醜いクエリ。

エンティティフレームワークを利用するために必要なサービスのいくつかを取得しようとしています。メソッドベースの構文を使用して、このクエリを機能させようとしています。まず、参加するすべてのオブジェクトのリストを取得します。

var students = ctx.syStudents.ToList(); //root
var statusCode = ctx.SySchoolStatus.ToList(); //inner
var status = ctx.syStatus.ToList(); //inner
var picture = ctx.CmStudentPictures.ToList(); //left outer

'ctx'は私のdbcontextクラスです。

私がこれまでに持っているクエリはこれです:

var query = students
   .GroupJoin(statusCode,
   student => student.SySchoolStatusID,
   statuscode => statuscode.SySchoolStatusID,
   (student, studentStatusCode) => new
   {
      StudentName = student.FirstName
   });

明らかに完全には実装されていませんが、これを実行するための最良の方法であるかどうかを把握しようとしています。これは、いくつかの内部結合があり、次に左外部結合もあるためです。これを行う方法は?

4

1 に答える 1

1

結合のラムダ構文よりもクエリ構文を強くお勧めします。

これらの線に沿って何かを試してください:

var result = 
from stu in SyStudent
join schsta in syschoolstatus on stu.syschoolstatusid equals schsta.syschoolstatusid //inner
join systa in SyStatus on schsta.SyStatusId equals systa.SyStatusId //innner
from pic in cmstudentpicture.Where(x => x.systudentid = stu.systudentid).DefaultIfEmpty() //outer 
where stu.sycampusid = 6
select new{
    stu,
    schsta,
    systa,
    pic
};
于 2013-03-25T15:38:31.757 に答える