c# - LINQ-To-SQL:实现 RANK() 的有效方法
问题描述
我正在尝试将以下 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。
对此有什么想法?
解决方案
并非所有 SQL 构造都可以移植到 LINQ。并非所有 LINQ 查询都尽可能高效地转换为 SQL。在某些情况下,最好用 SQL 编写查询并仅使用 ORM 实现其结果。您正在使用 LinqConnect,不是吗?然后你可以使用 DataContext.Query (字符串查询)方法:https://www.devart.com/linqconnect/docs/?Devart.Data.Linq~Devart.Data.Linq.DataContext~Query.html。
推荐阅读
- python - 线程不成功
- c++ - std::cin 和 std:.getline 的问题
- node.js - 如何知道使用 gmail 登录的用户何时收到电子邮件 NODEJS
- c# - 我的代码有什么问题?C# Block Cheat-Engine 和其他黑客工具
- http - 通过 IIS 10.0 对 Analysis Services 的 HTTP 访问不起作用
- java - 使用 JPA 将 JSON 存储到 postgres 中?
- php - {PAGENO} 导致 $pageno
- swift - 快速评估字符串
- pyspark - 如何在 Pyspark 中生成没有时区的 current_timestamp()?
- javascript - 三元运算符的使用