C#Entity Framework排序和分页会产生意外结果

时间:2016-08-07 12:39:20

标签: c# .net entity-framework

当我使用OrderBySkip以及Take的实体框架时,会有重复的记录,并且某些记录不会显示。

这是代码:

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

但是,如果我按Job之类的x => x.Title属性订购,则不存在任何问题。问题仅在与某个相关的工作实体进行排序时。在我的代码JobCompany中有一对多的关系。

请帮忙解决这个问题。

由于

1 个答案:

答案 0 :(得分:4)

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

假设我们有一张桌子:

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