2013-10-01 153 views
0

我需要找到所有未見過病人的醫生。我有表格:Doctor,Patient和DrPatientXref。我有工作的SQL查詢,但我無法弄清楚如何使這是一個Linq SQL查詢。將此查詢轉換爲Linq至SQL

select distinct Doctors.FirstName, Doctors.LastName, Doctors.DoctorId 
from Doctors, DrPatientXref 
where Doctors.DoctorId Not in 
(
    select DrPatientXref.DoctorId 
    from DrPatientXref 
    where DrPatientXref.PatientId = 23) 

這是我的裂紋它(這是痛苦的錯誤):

var results = from d in db.Doctors 
from x in db.DrPatientXrefs 
    where 
    (d.DoctorId == x.DoctorId && x.PatientId != patientId) 
    select new { 
     d.DoctorId, d.FirstName, d.LastName 
    }; 
    var listDrFullName = new List<DoctorFullName>(); 

    foreach (var dr in results) { 
     DoctorFullName drFullName = new DoctorFullName(); 
     drFullName.FullName = dr.LastName + ", " + dr.FirstName; 
     drFullName.DoctorId = dr.DoctorId; 
     listDrFullName.Add(drFullName); 
    } 
    return listDrFullName; 

的解決方案改變了變量 「結果」。那就是:

var results = db.Doctors.Except(
    (from x in db.DrPatientXrefs 
    join d in db.Doctors on x.DoctorId equals d.DoctorId 
    where x.PatientId == patientId // probably not needed... 
    select d) 
).ToList(); 

回答

0

最直接的方式實現這一目標和其他similair查詢Linq中是利用LINQ的的set based operationsExceptIntersectUnionDistinct)。以下是在查詢中使用Except的示例。

var drdrs = db.Doctors.Except(
    (from x in db.DrPatientXrefs 
    join d in db.Doctors on d.DoctorId equals x.DoctorId 
    where x.PatientId == patientId // probably not needed... 
    select d) 
).ToList(); 

我相信這應該做的伎倆(未經測試),只是你的代碼在過程中。

+0

就是這樣。只需稍作調整即可: var results = db.Doctors.Except( (從db.DrPatientXrefs中的x起) 在db.Doctors中加入d在x.DoctorId上等於d.DoctorId 其中x.PatientId == patientId //可能不需要... select d) ).ToList(); – user995727

0

試試這個:

var patientId = 23; 

var result = db.Doctors.Where(d => !db.DrPatientXref.Any(x => x.DoctorId == d.DoctorId 
     && x.PatientId == patientId)) 
.Select(d => new { d.FirstName, d.LastName, d.DoctorId }).ToList(); 
+0

這會產生:'DrPatientXref'不包含'Any'的定義。有其他選擇嗎? – user995727

+0

我想我忘了添加分貝,它應該是db.DrPatientXref。回答編輯。 –

+0

這工作完美。謝謝。 – user995727