这是我的代码:
var result = dbContext.Specialty.OrderByDescending(u => u.IdS)
.Skip(20)
.Take(10)
.AsEnumerable();
错误:
“OFFSET”附近的语法不正确。 FETCH 语句中 NEXT 选项的使用无效
为此有一个兼容性设置 (
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()));
}
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>());
对于任何使用 .Net 6 的人 我找到了这个包EntityFrameworkCore.UseRowNumberForPaging 0.3.0:https://www.nuget.org/packages/EntityFrameworkCore.UseRowNumberForPaging/
基于github问题:https://github.com/dotnet/efcore/issues/16400
谢谢你Rwing,无论你是谁,你都是英雄!
只是详细说明@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()));
我的查询不支持 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 项目格式。
上述答案解决了我在 Dotnet 8 中的问题。我正在使用 EFcore 连接到 Sql Server 2005。
内置
sqlOptions => sqlOptions.UseCompatabilityLevel(90) // for SqlServer 2005