Как преобразовать из Oracle SQL NVL, SUM, DECODE в C# LIINQ / SQL - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть 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 для этого примера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...