使用 Entity Framework 7 和 SQL Server 2008 进行分页
Paging with Entity Framework 7 and SQL Server 2008
我正在尝试使用分页(即 Entity Framework 7 中的 .Skip(...).Take(...)
。它适用于 Microsoft SQL Server 2012 和 2014,但失败并出现以下错误SQL 服务器 2008:
System.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.
我发现这是 EF 版本 6.1.2 (http://erikej.blogspot.com/2014/12/a-breaking-change-in-entity-framework.html) 中的重大更改。但解决方法是将 EDMX 文件设置 ProviderManifestToken 属性修改为“2008”。
问题是 EF7 目前只支持代码优先场景,因此没有任何 EDMX。问题是:如何使用 Entity Framework 7 配置 ASP.NET 5 网站以对 SQL 早于 2012 的服务器使用后备分页方法?
如果您使用 Edmx 文件,您必须使用 XML 编辑器打开 edmx 文件并更改
ProviderManifestToken="2012" ==> ProviderManifestToken="2008"
第 7 行
请查看此博客 post 了解更多信息:
http://erikej.blogspot.com.tr/2014/12/a-breaking-change-in-entity-framework.html
我自己在使用 EF 7 和 sql server 2008 时遇到了这个问题。幸运的是,在 EF 7 的最新 rc1 版本中,您可以使用 .UseRowNumberForPaging() 解决这个问题,如本例所示:
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<YourDbContext>(options =>
options.UseSqlServer(configuration["Data:DefaultConnection:ConnectionString"])
// this is needed unless you are on mssql 2012 or higher
.UseRowNumberForPaging()
);
它在 RC 1 中损坏。必须等待获得 RC 2。
你需要使用这样的东西:
var MinPageRank = (pageIndex - 1) * pageSize + 1;
var MaxPageRank = (pageIndex * pageSize);
var person = _context.Person.FromSql($"SELECT * FROM (SELECT [RANK] = ROW_NUMBER() OVER (ORDER BY Surname),* FROM Person) A WHERE A.[RANK] BETWEEN {MinPageRank} AND {MaxPageRank}").ToList();
IQueryable<Person> PersonIQ = from s in person.AsQueryable() select s;
Person = await PaginatedList<Person>.CreateAsync(PersonIQ .AsNoTracking(), pageIndex ?? 1, pageSize, sourceFull);
MyDbConnectionString 是来自任何来源的连接字符串
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(_config["MyDbConnectionString"],
options=>
{
options.UseRowNumberForPaging();
});
}
UseRowNumberForPaging()
解决了除 edmx 文件情况外的任何情况下的问题。
这里只要在ConfigureServices
中设置UseRowNumberForPaging()
services.AddDbContext<CallcContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Connectionstring"),opt=> { opt.UseRowNumberForPaging(); }));
EF Core 3.x、UseRowNumberForPaging
中的此功能 was removed 已标记为已过时。但是,您可以改用 EfCore3.SqlServer2008Query
包。 Nuget 中有 2 个包可用,一个用于 >= .NET 5.0,另一个用于 >= .NET 3.1
用法:
services.AddDbContext<MyDbContext>(o =>
o.UseSqlServer(Configuration.GetConnectionString("Default"))
.ReplaceService<IQueryTranslationPostprocessorFactory, SqlServer2008QueryTranslationPostprocessorFactory>());
我正在尝试使用分页(即 Entity Framework 7 中的 .Skip(...).Take(...)
。它适用于 Microsoft SQL Server 2012 和 2014,但失败并出现以下错误SQL 服务器 2008:
System.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.
我发现这是 EF 版本 6.1.2 (http://erikej.blogspot.com/2014/12/a-breaking-change-in-entity-framework.html) 中的重大更改。但解决方法是将 EDMX 文件设置 ProviderManifestToken 属性修改为“2008”。
问题是 EF7 目前只支持代码优先场景,因此没有任何 EDMX。问题是:如何使用 Entity Framework 7 配置 ASP.NET 5 网站以对 SQL 早于 2012 的服务器使用后备分页方法?
如果您使用 Edmx 文件,您必须使用 XML 编辑器打开 edmx 文件并更改
ProviderManifestToken="2012" ==> ProviderManifestToken="2008"
第 7 行
请查看此博客 post 了解更多信息: http://erikej.blogspot.com.tr/2014/12/a-breaking-change-in-entity-framework.html
我自己在使用 EF 7 和 sql server 2008 时遇到了这个问题。幸运的是,在 EF 7 的最新 rc1 版本中,您可以使用 .UseRowNumberForPaging() 解决这个问题,如本例所示:
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<YourDbContext>(options =>
options.UseSqlServer(configuration["Data:DefaultConnection:ConnectionString"])
// this is needed unless you are on mssql 2012 or higher
.UseRowNumberForPaging()
);
它在 RC 1 中损坏。必须等待获得 RC 2。
你需要使用这样的东西:
var MinPageRank = (pageIndex - 1) * pageSize + 1;
var MaxPageRank = (pageIndex * pageSize);
var person = _context.Person.FromSql($"SELECT * FROM (SELECT [RANK] = ROW_NUMBER() OVER (ORDER BY Surname),* FROM Person) A WHERE A.[RANK] BETWEEN {MinPageRank} AND {MaxPageRank}").ToList();
IQueryable<Person> PersonIQ = from s in person.AsQueryable() select s;
Person = await PaginatedList<Person>.CreateAsync(PersonIQ .AsNoTracking(), pageIndex ?? 1, pageSize, sourceFull);
MyDbConnectionString 是来自任何来源的连接字符串
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(_config["MyDbConnectionString"],
options=>
{
options.UseRowNumberForPaging();
});
}
UseRowNumberForPaging()
解决了除 edmx 文件情况外的任何情况下的问题。
这里只要在ConfigureServices
UseRowNumberForPaging()
services.AddDbContext<CallcContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Connectionstring"),opt=> { opt.UseRowNumberForPaging(); }));
EF Core 3.x、UseRowNumberForPaging
中的此功能 was removed 已标记为已过时。但是,您可以改用 EfCore3.SqlServer2008Query
包。 Nuget 中有 2 个包可用,一个用于 >= .NET 5.0,另一个用于 >= .NET 3.1
用法:
services.AddDbContext<MyDbContext>(o =>
o.UseSqlServer(Configuration.GetConnectionString("Default"))
.ReplaceService<IQueryTranslationPostprocessorFactory, SqlServer2008QueryTranslationPostprocessorFactory>());