2013-03-25 43 views
0

TL;博士版本:我需要這個SQL語句使用LINQ合作,EF無法弄清楚如何做到在LINQ多加入EF英孚

這是在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 
    }); 

顯然沒有完全實現,但我試圖得到一個想法,如果這是執行最好的辦法,因爲我有幾個內部連接,然後左外連接爲好,或者是有沒有得到這個工作更好,更易讀的方式?

回答

1

我肯定會推薦查詢語法在lambda語法進行連接。

試試沿着這些線路:

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 
}; 
+0

這看起來很不錯!非常可讀。不能測試它,直到我得到了應用程序多了一些部件在一起,但感謝您的快速答覆。 – ledgeJumper 2013-03-25 15:46:39