当我使用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
中有一对多的关系。
请帮忙解决这个问题。
由于
答案 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();