C#实体框架排序和分页会产生意外结果

本文关键字:意外 结果 分页 实体 框架 排序 | 更新日期: 2023-09-27 18:01:08

当我将实体框架与OrderBySkipTake一起使用时,会出现重复的记录,并且某些记录不会显示。

这是代码:

jobs = context.Jobs.Include("Company").
                OrderBy(x => x.Company.Name).
                Skip((page - 1) * PageSize).
                Take(PageSize).ToList();

但是,如果我通过Job属性(如x => x.Title(进行订购,则不会出现任何问题。问题仅在与作业的某些相关实体进行排序时出现。在我的代码中,JobCompany具有一对多关系。

请帮忙。

感谢

C#实体框架排序和分页会产生意外结果

您的查询没有完全定义结果行的顺序。

假设我们有一张桌子:

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();