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

Ali*_*eza 5 c# asp.net sql-server-2008 entity-framework-core asp.net-core

这是我的EF Core代码:

 int page = 1, rowPerPage = 5;
 int count = ctx.Specialty.Count();
 int start = page * rowPerPage;

 var Select = ctx.Specialty.OrderByDescending(u => u.IdS)
            .Skip(start)
            .Take(rowPerPage)
            .AsEnumerable();
Run Code Online (Sandbox Code Playgroud)

我正在使用SQL Server 2008和Visual Studio 2017,也安装了SQL Server 2017。我的项目是ASP.NET Core。

错误:

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

我认为问题是SQL Server 2008。

如何告诉我的项目使用SQL Server 2017?

Ell*_*ott 11

有一个兼容性设置(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());
    }
Run Code Online (Sandbox Code Playgroud)

或作为启动的一部分:

    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()));
    }
Run Code Online (Sandbox Code Playgroud)


Jaw*_*sim 10

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

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

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


pwr*_*imo 8

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

在此处输入图片说明

用法:

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