Я пытаюсь перенести следующую часть SQL на LINQ, и я могу добиться того, что мне нужно. Но я считаю, что должен быть лучший способ сделать это, поскольку SQL сгенерировано как CROSS JOIN, что неэффективно.
SQL для порта:
SELECT bu_code,
cust_no,
cust_name,
RANK () OVER (PARTITION BY bu_code, cust_no ORDER BY bank_id DESC) rnk
FROM customer;
LINQ для переноса вышеуказанного SQL:
from cust in customer
group cust by new { cust.BuCode, cust.CustomerNumber } into grp
let MaxBankId = grp.Max(g => g.BankId)
from cust in grp
where cust.BankId == MaxBankId
select new
{
cust.BuCode,
cust.CustomerNumber,
cust.CustomerName
};
SQL сгенерировано вышеуказанным запросом:
SELECT t3.BU_CODE, t3.CUST_NO, t3.CUST_NAME
FROM ( SELECT t2.BU_CODE AS "BuCode",
t2.CUST_NO AS "CustomerNumber",
MAX (t2.BANK_ID) AS C1
FROM CUSTOMER t2
WHERE ( :p0 <> 0)
AND (NOT (t2.BU_CODE IS NULL))
AND (t2.BU_CODE = :p1)
GROUP BY t2.BU_CODE, t2.CUST_NO) t1
CROSS JOIN CUSTOMER t3
WHERE (t3.BANK_ID = t1.C1)
AND (t1."BuCode" = t3.BU_CODE)
AND (t1."CustomerNumber" = t3.CUST_NO)
AND ( :p0 <> 0)
AND (NOT (t3.BU_CODE IS NULL))
AND (t3.BU_CODE = :p1)
PS: Я работаю с Oracle 11g и Devart.
Мысли по этому поводу?