【问题标题】:SQL Server 2008 and EF7 (RC1) - Cannot Skip() and Take()?SQL Server 2008 和 EF7 (RC1) - 不能 Skip() 和 Take()?
【发布时间】:2019-01-06 00:40:30
【问题描述】:

我知道 SQL Server 2012 及更高版本具有用于分页的新 OFFSET 语法,Entity Framework 7 似乎将我的 LINQ 转换为。

这解释了为什么我收到错误 Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.,因为 SQL Server 2008 无法识别它。

在this question 中,有人回答说,从 RC1 开始,我们需要做的就是在 Startup.cs 的 ConfigureServices() 上添加 .UseRowNumberForPaging()。

services.AddEntityFramework()
                    .AddSqlServer()
                    .AddDbContext<MyDbContext>(options => {
                        options.UseSqlServer("someConnectionString").UseRowNumberForPaging();                        
                    });

这似乎不起作用。我仍然遇到同样的错误。我的猜测是 EF7 仍然将我的 LINQ 编译为新的 2012+ SQL 语法。怎么办?

【问题讨论】:

  • 您的查询是什么?这可能是 EF7 中的一个错误。
  • 我认为这无关紧要,但是任何 db.OneOfMyEntities.Where(...)....Skip(x).Take(y).ToList() 都会产生此错误.
  • EF7-rc1 在跳过和拍摄中存在错误,正在为 RC2 处理。见github.com/aspnet/EntityFramework/…

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


【解决方案1】:

使用skip().take()需要使用SQL2012+,在sql2008中不行。

对于 2008 年,您可以使用:

select top 20 * from
(
select *,
ROW_NUMBER() OVER (ORDER BY columnid) AS ROW_NUM
from tablename
) x
where ROW_NUM>10

【讨论】:

    【解决方案2】:

    您的问题似乎已在github 交叉发布和解决。

    这个问题的解决方案是,正如 Arthur Vickers 的stated,转到您项目的Startup.cs 并将UseRowNumberForPaging() 添加到您的数据库选项构建器中。

    services.AddDbContext<ApplicationDbContext>(
      options => {
        options.UseSqlServer(
          this.config.GetConnectionString("MyDatabaseConnectionString"),
          builder => builder.UseRowNumberForPaging()
        );
      }
    );
    

    我使用 .NET Core 2 对此进行了测试,它运行良好。

    【讨论】:

      猜你喜欢
      • 2013-11-28
      • 2018-02-03
      • 2012-06-12
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      相关资源
      最近更新 更多