【问题标题】:Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement "in Entity Framework core"'OFFSET' 附近的语法不正确。 “在实体框架核心”中的 FETCH 语句中选项 NEXT 的使用无效
【发布时间】:2019-04-20 07:20:13
【问题描述】:

这是我的 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();

错误

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

【问题讨论】:

  • 您是连接到 SQL 2008 数据库还是 SQL 2017 数据库(检查您的连接字符串)?
  • @mjwills SQL 2008
  • 您需要更改连接字符串以指向 SQL 2017 数据库。
  • 如果您的系统上有 SQL Server 2008 2017,至少其中一个必须使用明确的实例名称 - 只需使用您的连接字符串连接到该 SQL Server 实例

标签: c# asp.net sql-server-2008 asp.net-core entity-framework-core


【解决方案1】:

对此有一个兼容性设置 (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()));
    }

【讨论】:

    【解决方案2】:

    UseRowNumberForPaging was removed 在 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>());
    

    【讨论】:

    • 你知道我在哪里可以得到那个 nuget 的源代码吗?
    • 是的,这个包可以工作,但我们不知道它有多安全
    【解决方案3】:

    我的查询不支持 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 项目格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 2017-01-08
      • 2018-06-26
      相关资源
      最近更新 更多