У меня есть Oracle SQL запрос:
select min (stpl_r.stpl$code) stpl$code
, min (stpl_r.lag_ber$code) lag_ber$code
, min (stpl_r.gang$code) gang$code
, sum (decode (lm.id, NULL, 0, 1)) lm_anz_r
, nvl (max (stpl_v.stpl$ps_anzahl), 0) ps_anz_v
, stpl_r.stpl$id stpl$id
from lademittel lm
, stellplatz_view stpl_v
, stellplatz_view stpl_r
where stpl_v.stpl$code (+) = stpl_r.stpl$code
and stpl_v.lag_ber$id (+) = stpl_r.lag_ber$id
and stpl_v.stpl$art (+) = 'V'
and lm.stpl_id_rampe (+) = stpl_r.stpl$id
and lm.lag_geplant (+) = 'J'
and stpl_r.lag_ber$knoten_id = :cg$ctrl.lag_knoten_id
and stpl_r.stpl$art = 'R'
group by stpl_r.stpl$id
order by 1
Я пытался сделать это в C# следующим образом:
var query = (from stpl_r in context.STELLPLATZ_VIEW.AsNoTracking()
join lm in context.LADEMITTEL.AsNoTracking()
on stpl_r.STPL_ID equals lm.STPL_ID_RAMPE into lm_stpl_r
from lm in lm_stpl_r.DefaultIfEmpty()
join stpl_v in context.STELLPLATZ_VIEW.AsNoTracking()
on stpl_r.STPL_ID equals stpl_v.STPL_ID into stpl_rv
from stpl_v in stpl_rv.DefaultIfEmpty()
where stpl_r.LAG_BER_KNOTEN_ID == msi.BA_KNOTEN_ID &&
stpl_r.STPL_ART == "R"
group new { stpl_r, lm, stpl_v } by stpl_r.STPL_ID into g
select new LOVBeladeTorDTO
{
STPL_CODE = g.Min(q => q.stpl_r.STPL_CODE),
BEREICH_CODE = g.Min(q => q.stpl_r.LAG_BER_CODE),
GANG_CODE = g.Min(q => q.stpl_r.GANG_CODE),
LM_ANZ_R = g.Count(q => q.lm.ID != null),
PS_ANZ_V = g.Where(q => q.stpl_v.STPL_ART == "V").Max(q => q.stpl_v.STPL_PS_ANZAHL)
});
Первые три столбца (STPL_CODE , BEREICH_CODE, GANG_CODE) работают, но я изо всех сил пытаюсь получить правильные результаты для LM_ANZ_R и PS_ANZ_V. Как я могу к левому внешнему соединению ограничить STPL_ART == "V" и? И как я могу добавить эквивалентный левый предел внешнего соединения в C# для: stpl_v.lag_ber $ id (+) = stpl_r.lag_ber $ id? А как правильно сделать NVL и DECODE в C# linq для этого примера?