В LINQ вы используете DefaultIfEmpty для достижения левого внешнего соединения - примеры на http://msdn.microsoft.com/en-us/library/bb397895.aspx
Предполагая, что рефералы не являются (потенциально пустыми) коллекциями в планах обслуживания, поэтому вы объединяете две коллекциивместе ...
По вашему запросу это будет что-то вроде:
Получить последнее направление для каждого плана ухода:
var latestReferrals = from r in referrals
group r by r.CarePlanId into lr
select new { CarePlanId = lr.Key, LatestReferral = lr.OrderByDescending(lrd => lrd.Date).First()};
Найти объединенные данные:
var q = from c in CarePlan
where c.PatientId = 'E4A1DA8B-F74D-4417-8AC7-B466E3B3FFD0'
join lr in latestReferrals on c.CarePlanId equals lr.CarePlanId into gj
from subReferral in gj.DefaultIfEmpty()
select new { CarePlanId = c.CarePlanId, LatestReferral = (subReferral == null) ? null : subReferral.LatestReferral };
В зависимости от того, хотите ли вы иметь много свойств рефералов или только несколько, вы можете захотеть или не захотеть весь объект рефералов во второй части или просто извлекать соответствующие свойства.
Возможно, вы сможете объединить их в один запрос, но для удобства чтения их будет проще разделить.Если есть комбинированное решение, вы также должны сравнить производительность двух подходов.
РЕДАКТИРОВАТЬ: см. Комментарий о присоединении пациентов / других таблиц к планам ухода
Если пациент присоединился по направлению (согласно комментарию), то это более сложно, поскольку вы выполняете несколько внешних левых соединений.Так что переключаемся на чуть более лаконичный синтаксис:
var combined = from c in carePlans
where c.PatientId = 'E4A1DA8B-F74D-4417-8AC7-B466E3B3FFD0'
from lr in latestReferral.Where(r => r.CarePlanId == c.CarePlanId).DefaultIfEmpty()
from p in patients.Where(patient => patient.PatientId == ((lr != null) ? lr.LatestReferral.PatientId : -1)).DefaultIfEmpty()
select new { c.CarePlanId, PatientName = (p == null) ? "no patient" : p.PatientName, LatestReferral = (lr == null) ? null : lr.LatestReferral };