C# 如何使用实体框架在不查询所有数据的情况下获取SQL数据库中的行索引?

C# 如何使用实体框架在不查询所有数据的情况下获取SQL数据库中的行索引?,c#,sql-server,entity-framework,linq,C#,Sql Server,Entity Framework,Linq,我们有一个数据库,有上千个条目。我们希望通过名称获得特定项目的“排名” 由于存在大量数据,我们希望避免为了确定行索引而查询所有数据(例如使用ToList()和IndexOf()) 我试着用 List<Ranking> ranking = _context.Testes .OrderByDescending(t => t.Val) .Select((d, i) => new Ranking() {

我们有一个数据库,有上千个条目。我们希望通过名称获得特定项目的“排名”

由于存在大量数据,我们希望避免为了确定行索引而查询所有数据(例如使用
ToList()
IndexOf()

我试着用

        List<Ranking> ranking = _context.Testes
           .OrderByDescending(t => t.Val)
           .Select((d, i) => new Ranking() {
               Name = d.Name,
               Ranking= i
           }).First(d=>d.Name = "Test");
List ranking=\u context.Testes
.OrderByDescending(t=>t.Val)
.Select((d,i)=>新排名(){
Name=d.Name,
排名=i
}).首先(d=>d.Name=“测试”);
但我有一个错误:

'value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable'1[WebApplication4.Models.Teste]).OrderByDescending(t=>t.Val)。Select((d,i)=>new Ranking(){Name=d.Name,Ranking=i}):当前不支持方法'System.Linq.Queryable.Select'的此重载


这可能吗?

您无法将此Select()重载转换为SQL。ORM不用于报告,这是一个100%的报告查询

SQL Server提供了行数、秩和密集秩。您可以创建一个视图来计算排名并将您的排名映射到该视图,例如:

CREATE VIEW Rankings 
AS 
SELECT 
    Name,
    DENSE_RANK() OVER(ORDER BY Val) Ranking 
From Tests
densite\u RANK()
如果两条记录并列并继续下一个列组编号,则将返回相同的列组编号。行号将只使用递增的数字。如果您使用
ROW\u NUMBER
,您可能应该使用额外的排序标准,以避免为领带生成随机排名

EF可能会按照惯例将排名类映射到排名视图。如果不是,则使用表属性进行映射;如果使用代码优先配置,则使用
ToTable

[Table("Rankings")
public class Ranking
{
    public string Name{get;set;}
    public int Ranking {get;set;}
}
检索特定排名只需要
Where()
子句:

var someRanking=context.Rankings.Where(r=>r.Name=someName);

无法将此Select()重载转换为SQL。ORM不用于报告,这是一个100%的报告查询

SQL Server提供了行数、秩和密集秩。您可以创建一个视图来计算排名并将您的排名映射到该视图,例如:

CREATE VIEW Rankings 
AS 
SELECT 
    Name,
    DENSE_RANK() OVER(ORDER BY Val) Ranking 
From Tests
densite\u RANK()
如果两条记录并列并继续下一个列组编号,则将返回相同的列组编号。行号将只使用递增的数字。如果您使用
ROW\u NUMBER
,您可能应该使用额外的排序标准,以避免为领带生成随机排名

EF可能会按照惯例将排名类映射到排名视图。如果不是,则使用表属性进行映射;如果使用代码优先配置,则使用
ToTable

[Table("Rankings")
public class Ranking
{
    public string Name{get;set;}
    public int Ranking {get;set;}
}
检索特定排名只需要
Where()
子句:

var someRanking=context.Rankings.Where(r=>r.Name=someName);
在LINQ中类似(注意,您必须处理关系才能获得定义良好的排名)

var q=从t开始,单位为db.Testes
其中t.Name==“无论什么”
选择新的
{
睾丸=t,
秩=1+db.Testes.Where(ot=>ot.Val
也就是说

SELECT 
    [Project1].[Id] AS [Id], 
    [Project1].[Val] AS [Val], 
    [Project1].[Name] AS [Name], 
    1 + [Project1].[C1] AS [C1]
    FROM ( SELECT 
        [Extent1].[Id] AS [Id], 
        [Extent1].[Val] AS [Val], 
        [Extent1].[Name] AS [Name], 
        (SELECT 
            COUNT(1) AS [A1]
            FROM [dbo].[Testes] AS [Extent2]
            WHERE ([Extent2].[Val] < [Extent1].[Val]) OR (([Extent2].[Val] = [Extent1].[Val]) AND ([Extent2].[Id] < [Extent1].[Id]))) AS [C1]
        FROM [dbo].[Testes] AS [Extent1]
        WHERE N'whatever' = [Extent1].[Name]
    )  AS [Project1]
选择
[Project1]。[Id]作为[Id],
[Project1].[Val]作为[Val],
[Project1]。[Name]作为[Name],
1+[Project1].[C1]作为[C1]
从(选择
[Extent1].[Id]作为[Id],
[Extent1].[Val]作为[Val],
[Extent1].[Name]作为[Name],
(选择
将(1)计为[A1]
来自[dbo]。[Testes]作为[Extent2]
其中([Extent2].[Val]<[Extent1].[Val])或([Extent2].[Val]=[Extent1].[Val])和([Extent2].[Id]<[Extent1].[Id])作为[C1]
来自[dbo]。[Testes]作为[Extent1]
其中N'whatever'=[Extent1].[Name]
)AS[Project1]
在LINQ中类似(注意,您必须处理关系才能获得定义良好的排名)

var q=从t开始,单位为db.Testes
其中t.Name==“无论什么”
选择新的
{
睾丸=t,
秩=1+db.Testes.Where(ot=>ot.Val
也就是说

SELECT 
    [Project1].[Id] AS [Id], 
    [Project1].[Val] AS [Val], 
    [Project1].[Name] AS [Name], 
    1 + [Project1].[C1] AS [C1]
    FROM ( SELECT 
        [Extent1].[Id] AS [Id], 
        [Extent1].[Val] AS [Val], 
        [Extent1].[Name] AS [Name], 
        (SELECT 
            COUNT(1) AS [A1]
            FROM [dbo].[Testes] AS [Extent2]
            WHERE ([Extent2].[Val] < [Extent1].[Val]) OR (([Extent2].[Val] = [Extent1].[Val]) AND ([Extent2].[Id] < [Extent1].[Id]))) AS [C1]
        FROM [dbo].[Testes] AS [Extent1]
        WHERE N'whatever' = [Extent1].[Name]
    )  AS [Project1]
选择
[Project1]。[Id]作为[Id],
[Project1].[Val]作为[Val],
[Project1]。[Name]作为[Name],
1+[Project1].[C1]作为[C1]
从(选择
[Extent1].[Id]作为[Id],
[Extent1].[Val]作为[Val],
[Extent1].[Name]作为[Name],
(选择
将(1)计为[A1]
来自[dbo]。[Testes]作为[Extent2]
其中([Extent2].[Val]<[Extent1].[Val])或([Extent2].[Val]=[Extent1].[Val])和([Extent2].[Id]<[Extent1].[Id])作为[C1]
来自[dbo]。[Testes]作为[Extent1]
其中N'whatever'=[Extent1].[Name]
)AS[Project1]

Skip-and-Take分页?Skip-and-Take将获得列表的第n个位置。我想提供一个“名称”并查询其排名位置。您无法将此
Select()
重载转换为SQL。ORM不用于报告,这是一个100%的报告查询。SQL Server提供了诸如
行数
排名
密集排名
等排名功能。您可以创建一个视图来计算排名并将您的排名映射到它,例如
创建视图排名作为SELECT Name,rank OVER(ORDER BY Val)测试排名
。EF可能会按照惯例将
排名
类映射到
排名
视图。如果没有,您可以使用
attributePaging with Skip and Take?Skip and Take将获得列表的第n个位置。我想提供一个“名称”并查询其排名位置。您无法将此
Select()
重载转换为SQL。ORM不用于报告,这是一个100%的报告查询。SQL Server提供了诸如
行数
排名
密集排名
等排名功能。您可以创建一个用于计算排名和ma的视图