C#实体框架排序和分页会产生意外结果
本文关键字:意外 结果 分页 实体 框架 排序 | 更新日期: 2023-09-27 18:01:08
当我将实体框架与OrderBy
、Skip
和Take
一起使用时,会出现重复的记录,并且某些记录不会显示。
这是代码:
jobs = context.Jobs.Include("Company").
OrderBy(x => x.Company.Name).
Skip((page - 1) * PageSize).
Take(PageSize).ToList();
但是,如果我通过Job
属性(如x => x.Title
(进行订购,则不会出现任何问题。问题仅在与作业的某些相关实体进行排序时出现。在我的代码中,Job
和Company
具有一对多关系。
请帮忙。
感谢
您的查询没有完全定义结果行的顺序。
假设我们有一张桌子:
Id Name
1 Bar
2 Foo
3 Bar
按Name
排序时,可能会出现以下结果集:
Id Name
1 Bar
3 Bar
2 Foo
和
Id Name
3 Bar
1 Bar
2 Foo
每个调用都可能返回这些集合中的任何一个,所以如果我们有页面大小1
,就有可能得到这样奇怪的结果:
Id Name
1 Bar // 1st set
1 Bar // 2nd set
2 Foo // 1st set
在密钥中添加一些唯一属性(在大多数情况下为PK(可以修复这种行为。
给定密钥Name, Id
,只有一个可能的结果:
Id Name
1 Bar
3 Bar
2 Foo
所以您的查询应该是这样的(假设JobId
是PK(:
jobs = context.Jobs.Include("Company").
OrderBy(x => x.Company.Name).
ThenBy(x => x.JobId).
Skip((page - 1) * PageSize).
Take(PageSize).ToList();