LINQ-To- SQL: эффективный способ реализации RANK () - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь перенести следующую часть 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.

Мысли по этому поводу?

1 Ответ

0 голосов
/ 07 августа 2020

Не все конструкции SQL могут быть перенесены в LINQ. Не все запросы LINQ переводятся в SQL с максимальной эффективностью. В некоторых ситуациях лучше написать запрос в SQL и материализовать его результат только с помощью ORM. Вы используете LinqConnect, не так ли? Затем вы можете использовать метод DataContext.Query (строковый запрос): https://www.devart.com/linqconnect/docs/?Devart.Data.Linq ~ Devart.Data.Linq.DataContext ~ Query. html.

...