“OFFSET”附近的语法不正确。 “在实体框架核心中”的 FETCH 语句中选项 NEXT 的使用无效

问题描述 投票:0回答:6

这是我的代码:

 var result = dbContext.Specialty.OrderByDescending(u => u.IdS)
            .Skip(20)
            .Take(10)
            .AsEnumerable();

错误

“OFFSET”附近的语法不正确。 FETCH 语句中 NEXT 选项的使用无效

c# asp.net sql-server-2008 asp.net-core entity-framework-core
6个回答
20
投票

为此有一个兼容性设置 (

UseRowNumberForPaging
),可以在 DbContext 本身中进行配置:

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var coonectionString = "Data Source=localhost\\MSSQLSERVER01;Initial Catalog=AppDb01;Integrated Security=True";
        optionsBuilder.UseSqlServer(coonectionString, builder => builder.UseRowNumberForPaging());
    }

或者作为初创公司的一部分:

    public void ConfigureServices(IServiceCollection services)
    {
        var coonectionString = "Data Source=localhost\\MSSQLSERVER01;Initial Catalog=AppDb01;Integrated Security=True";
        services.AddDbContext<AppDbContext>(options => options.UseSqlServer(coonectionString, builder => builder.UseRowNumberForPaging()));
    }

12
投票

UseRowNumberForPaging
在 EF Core 3.x 中被删除,方法被标记为已过时。但是,您可以使用
EfCore3.SqlServer2008Query
包代替。 Nuget 中有 2 个可用的软件包,一个适用于 >= .NET 5.0,另一个适用于 >= .NET Core 3.1

用途:

 services.AddDbContext<MyDbContext>(o => 
       o.UseSqlServer(Configuration.GetConnectionString("Default"))
        .ReplaceService<IQueryTranslationPostprocessorFactory, SqlServer2008QueryTranslationPostprocessorFactory>());

10
投票

对于任何使用 .Net 6 的人 我找到了这个包EntityFrameworkCore.UseRowNumberForPaging 0.3.0https://www.nuget.org/packages/EntityFrameworkCore.UseRowNumberForPaging/

基于github问题:https://github.com/dotnet/efcore/issues/16400

谢谢你Rwing,无论你是谁,你都是英雄!


3
投票

只是详细说明@jawid-hassim 的答案:

使用.NET 6 + EF Core 6 + SQL Server 2008,您可以安装以下软件包(它有一个GitHub存储库,因此可以检查代码的安全性)。

https://www.nuget.org/packages/EntityFrameworkCore.UseRowNumberForPaging/

安装包后,在Program.cs中添加:

using EntityFrameworkCore.UseRowNumberForPaging;

然后替换您的 DbContext 服务配置:

builder.Services.AddDbContext<YourDbContext>(options => options.UseSqlServer(connectionString));

对于:

builder.Services.AddDbContext<YourDbContext>(options => options.UseSqlServer(connectionString, o => o.UseRowNumberForPaging()));

1
投票

我的查询不支持 SQL Server 2008

解决方案

public class AppDbContext : DbContext
{

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var coonectionString = "Data Source=localhost\\MSSQLSERVER01;Initial Catalog=AppDb01;Integrated Security=True";
        optionsBuilder.UseSqlServer(coonectionString);
    }
}

目标服务器的值连接字符串 并且还注入设置,示例代码采用默认的 ASP NET Core 项目格式。


0
投票

上述答案解决了我在 Dotnet 8 中的问题。我正在使用 EFcore 连接到 Sql Server 2005。

内置

sqlOptions => sqlOptions.UseCompatabilityLevel(90) // for SqlServer 2005 

没有解决“OFFSET”问题。

© www.soinside.com 2019 - 2024. All rights reserved.