Как написать Count, Distinct in LINQ от Oracle - PullRequest
1 голос
/ 25 февраля 2012

У меня есть запрос в Oracle, который я пытаюсь преобразовать в linq.Я думаю, что я почти там.Вот запрос в Oracle.У меня была быстрая проблема с левыми внешними объединениями в запросе.Пожалуйста, учтите это тоже в вопросе.Моя главная проблема в том, что я не могу писать, используя это количество, отличающееся для разных столбцов таблицы.

SELECT COUNT(DISTINCT claimant_id || rqst_wk_dt || claim_id) AS no_of_weeks_compensated
     , SUM(pmt_am) AS total_payments
     , COUNT(DISTINCT claimant_id || claim_id)
  FROM (SELECT c.claimant_id
             , c.claim_id
             , c.rqst_wk_dt
             , a.pmt_am
          FROM ui_mon_hdr d

         INNER JOIN ui_rqst_wk_ctrl c
            ON d.claimant_id = c.claimant_id
           AND d.claim_id = c.claim_id

          LEFT OUTER JOIN ui_dstb_pmt a
            ON c.claimant_id = a.claimant_id
           AND c.claim_id = a.claim_id
           AND c.rqst_wk_dt = a.rqst_wk_dt
           AND a.rcpnt_id = 'CLMNT'

          LEFT OUTER JOIN ui_claim_pmt b
            ON c.claimant_id = b.claimant_id
           AND c.claim_id = b.claim_id
           AND warrant_dt BETWEEN '1 June 2011' AND '30 June 2011'
           AND b.status_cd = 'PAID'
           AND a.rcpnt_id = b.rcpnt_id --AND  A.PMT_NU = B.PMT_NU

          LEFT OUTER JOIN ui_auth_pmt e
            ON c.claimant_id = e.claimant_id
           AND c.claim_id = e.claimant_id
           AND c.rqst_wk_dt = e.rqst_wk_dt
           AND d.mon_seq_nu = e.mon_seq_nu

         WHERE c.rqst_wk_dt BETWEEN '1 June 2011' AND '30 June 2011'
           AND d.bspd_type_cd = 'ALTR')

Выше приведен запрос, который я имею в Oracle и выполняю в TOAD.Ниже приведен запрос в LINQ.Я только что сделал внутренний оператор выбора и Интересно, как реализовать счетчик выбора и различные для запроса:

var enddate = Convert.ToDateTime("6/30/2011");
var Altquery = from D in UiMonHdr
join C in UiRqstWkCtrl on new {D.ClaimantId, D.ClaimId} equals new {C.ClaimantId, C.ClaimId}
join A in UiDstbPmt on new {C.ClaimantId, C.ClaimId , C.RqstWkDt} equals new {A.ClaimantId, A.ClaimId, A.RqstWkDt}
    where A.RcpntId.Contains("CLMNT")
join B in UiClaimPmt on new {C.ClaimantId, C.ClaimId, A.RcpntId} equals new {B.ClaimantId, B.ClaimId, B.RcpntId}
    where B.StatusCd.Contains("PAID") && B.WarrantDt >= startdate && B.WarrantDt <= enddate
join E in UiAuthPmt on new {C.ClaimantId, C.ClaimId , C.RqstWkDt} equals new {E.ClaimantId, E.ClaimId, E.RqstWkDt}
    where C.RqstWkDt >= startdate && C.RqstWkDt <= enddate && D.BspdTypeCd.Contains("ALTR")
select new {ClaimantId = C.ClaimantId, ClaimId = C.ClaimId, PmtAmt = A.PmtAm, RqstWkDt = C.RqstWkDt}; Altquery.Dump();
...