2013-03-04 33 views
0

我試圖將SQL查詢「轉換」爲LINQ,直到現在沒有成功。對LINQ轉換的SQL查詢(LEFT JOIN和NULL值)

這是我的SQL查詢,返回一個結果與空值幾列(正確的輸出):

SELECT patient.idPatient, removed, fat.status AS FATstatus, fad.status AS FADstatus, 
fa.status AS FAstatus, fdv.status AS FDVstatus, ffu.status AS FFUstatus, fmbct.status 
AS FMBCTstatus, fnt.status AS FNTstatus, fs.status AS FSstatus, ftd.status AS FTDstatus 
FROM patient 
LEFT JOIN FormAdjuvantTreatment fat ON patient.idPatient = fat.idPatient 
LEFT JOIN FormAdvancedDisease fad ON patient.idPatient = fad.idPatient 
LEFT JOIN FormAnamnesis fa ON patient.idPatient = fa.idPatient 
LEFT JOIN FormDemoVariables fdv ON patient.idPatient = fdv.idPatient 
LEFT JOIN FormFollowUp ffu ON patient.idPatient = ffu.idPatient 
LEFT JOIN FormMBCTreatment fmbct ON patient.idPatient = fmbct.idPatient 
LEFT JOIN FormNeoadjuvantTreatment fnt ON patient.idPatient = fnt.idPatient 
LEFT JOIN FormSurgery fs ON patient.idPatient = fs.idPatient 
LEFT JOIN FormTumorDisease ftd ON patient.idPatient = ftd.idPatient 
WHERE patient.idResearcher = '01-01'; 

這是我翻譯的LINQ查詢。我不返回任何結果(不正確的輸出):

var query = (from u in db.Patients.DefaultIfEmpty() 
join fat in db.FormAdjuvantTreatments on u.idPatient equals fat.idPatient 
join fad in db.FormAdvancedDiseases on u.idPatient equals fad.idPatient 
join fa in db.FormAnamnesis on u.idPatient equals fa.idPatient 
join fdv in db.FormDemoVariables on u.idPatient equals fdv.idPatient 
join ffu in db.FormFollowUps on u.idPatient equals ffu.idPatient 
join fmbct in db.FormMBCTreatments on u.idPatient equals fmbct.idPatient 
join fnt in db.FormNeoadjuvantTreatments on u.idPatient equals fnt.idPatient 
join fs in db.FormSurgeries on u.idPatient equals fs.idPatient 
join ftd in db.FormTumorDiseases on u.idPatient equals ftd.idPatient 
where u.idResearcher == idResearcher 
select new 
{ 
    u.idPatient, 
    u.removed, 
    FormAdjuvantTreatment = (fat.status == null ? "NULL" : fat.status), 
    FormAdvancedDisease = (fad.status == null ? "NULL" : fad.status), 
    FormAnamnesi = (fa.status == null ? "NULL" : fa.status), 
    FormDemoVariable = (fdv.status == null ? "NULL" : fdv.status), 
    FormFollowUp = (ffu.status == null ? "NULL" : ffu.status), 
    FormMBCTreatment = (fmbct.status == null ? "NULL" : fmbct.status), 
    FormNeoadjuvantTreatment = (fnt.status == null ? "NULL" : fnt.status), 
    FormSurgery = (fs.status == null ? "NULL" : fs.status), 
    FormTumorDisease = (ftd.status == null ? "NULL" : ftd.status), 
}).ToList(); 
+1

提示:?,而不是'(fat.status == NULL「NULL 「:fat.status'你可以寫'fat.status ??」NULL「'。你正在做內部連接這裏 – 2013-03-04 23:43:35

+0

hi lazyberezovsky, 我已經改變了內聯ifs到你的建議任何線索爲什麼我是沒有得到與SQL查詢相同的結果?我在做什麼錯? – Ricky 2013-03-05 00:00:44

+0

正如我上面所說的,你在做內連接而不是左連接。如果你使用左連接(語法是'join..into'),你的查詢將是完全不可讀的(語法是'join..into') – 2013-03-05 00:08:58

回答

1

感謝@lazyberezovsky和@彼得 - Geerkens我已經解決了我的問題。

SQL查詢(內左連接):

SELECT patient.idPatient, removed, fat.status AS FATstatus 
FROM patient 
LEFT JOIN FormAdjuvantTreatment fat ON patient.idPatient = fat.idPatient 
WHERE patient.idResearcher = '01-01'; 

翻譯正確的LINQ查詢(內左連接):

var query = (from u in db.Patients.DefaultIfEmpty() 
join fat in db.FormAdjuvantTreatments on u.idPatient equals fat.idPatient into JoinedPatientFAT 
from fat in JoinedPatientFAT.DefaultIfEmpty() 
where u.idResearcher == idResearcher 
select new 
{ 
u.idPatient, 
u.removed, 
FormAdjuvantTreatment = fat.status ?? "NULL" 
} 
).ToList();