gpt4 book ai didi

c# - Entity Framework 中是否有一个函数可以转换为 SQL 中的 RANK() 函数?

转载 作者:可可西里 更新时间:2023-11-01 09:11:45 25 4
gpt4 key购买 nike

假设我想按国家/地区对我的客户数据库进行排名。在 SQL 中我会写:

select CountryID, CustomerCount = count(*), 
[Rank] = RANK() over (order by count(*) desc)
from Customer

现在我想在 Entity Framework 中写这个:

var ranks = db.Customers
.GroupBy(c => c.CountryID)
.OrderByDescending(g => g.Count())
.Select((g, index) => new {CountryID = g.Key, CustomerCount = g.Count, Rank = index+1});

这有两个问题:

  1. 它不起作用。 EF 抛出 System.NotSupportedException;显然 overload of .Select() 没有 SQL 翻译使用行号;为了能够调用此方法,您必须使用 .ToList() 将所有内容拉入内存;和
  2. 即使您在本地内存中运行该方法,它也不会像 RANK() 那样处理相同的排名。函数在 SQL 中执行,即它们应该具有相同的等级,然后后面的项目将跳到原来的顺序。

那么我应该怎么做呢?

最佳答案

AFAIK Rank() 在 LINQ 中没有内置函数。 This answer使用你的方法,但它似乎对他们有用。以下是您可以如何使用它:

var customersByCountry = db.Customers
.GroupBy(c => c.CountryID);
.Select(g => new { CountryID = g.Key, Count = g.Count() });
var ranks = customersByCountry
.Select(c => new
{
c.CountryID,
c.Count,
Rank = customersByCountry.Count(c2 => c2.Count > c.Count) + 1
});

关于c# - Entity Framework 中是否有一个函数可以转换为 SQL 中的 RANK() 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27469838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com