Как я могу сделать этот SQL в Linq?(Левое внешнее соединение с датами) - PullRequest
0 голосов
/ 04 марта 2012

Мой LINQ не самый лучший, также как и мой SQL, но я пытаюсь сделать что-то подобное в LINQ (своего рода в псевдокоде)

select * from CarePlan c 
-- only newest Referral based on r.Date (if more than one exists)
left outer join Referral r on r.CarePlanId = c.CarePlanId 
where c.PatientId = 'E4A1DA8B-F74D-4417-8AC7-B466E3B3FFD0'    

Данные выглядят так:

  • Пациент может иметь несколько планов по уходу
  • каждый план ухода может иметь от 0 до n рефералов (я хочу, чтобы в каждом плане ухода был самый новый реферал - если таковой существует)

Хотел бы вернуть список планов по уходу для каждого пациента (независимо от того, есть ли у него направление или нет, если у него более одного направления - получите самый новый)

Спасибо за любую помощь, ребята

1 Ответ

1 голос
/ 04 марта 2012

В 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 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...