我正在使用以下代码查询我的数据库:
private const int PAGE_SIZE = 10;
public static IList<Image> GetTopImagesForUser(String connectionString, int userID, int page)
{
dbDataContext db = new dbDataContext(connectionString);
var images = (from p in db.Images
where (p.SubmitterUserIndex == userID &&
p.URL != "none" &&
p.ThumbURL != "none")
orderby p.Rep descending
select p).Skip(page * PAGE_SIZE).Take(PAGE_SIZE);
/* snip */
return topImages;
}
如果我用页面为0来调用此代码,一切都按照我想要的方式运行 - 我得到一个很好的有序列表,10个结果,一切都正确。
如果我使用页面为1来调用此代码,则第0页中的行最终会在第1页中出现。我甚至无法理解原因。我已经检查了我的数据库是否有重复的行,没有。我已经检查过以确保每一行的网址和 ThumbURL 都不是“无”。这也不是问题所在。我已经检查过以确保页面是我在调用此方法时所期望的,并且它始终是我所期望的。
真正令我困惑的是,以下方法与 orderby 子句中的第一种方法不同,完全按预期工作。
public static IList<Image> GetAllImagesForUser(String connectionString, int userID, int page)
{
dbDataContext db = new dbDataContext(connectionString);
var images = (from p in db.Images
where (p.SubmitterUserIndex == userID &&
p.URL != "none" &&
p.ThumbURL != "none")
orderby p.SubmitTime descending
select p).Skip(page * PAGE_SIZE).Take(PAGE_SIZE);
/* snip */
return allImages;
}
有没有人碰到这样的事情?我的查询应该采用不同的形式来执行我想要的操作吗?我不确定我能错过什么。
答案 0 :(得分:8)
当您说没有任何“重复行”时 - 任何返回的行是否具有相同的Rep值?如果是这样,其中的排序将是不确定的。
尝试
orderby p.Rep descending, p.SubmitTime
(或其他一些将完全确定的顺序)以获得更可预测的结果。
另外,这是LINQ to SQL吗?如果是这样,您应该查看生成的SQL以查看发生了什么。
答案 1 :(得分:2)
在不使用LINQ时,我一直对分页中的类似问题感到困惑,只是使用SELECT查询(在sproc中)。我认为问题可能是Rep字段不是唯一的,但作为日期的SubmitTime字段可能是唯一的。
我建议您在Rep之后尝试第二个字段以使Order By始终以相同的顺序返回结果。它可以是任何使记录独特的领域;你不必在结果中使用它。
答案 2 :(得分:1)
在第一种情况下,您要排序的Rep
列可能包含重复项。当您从包含值为1的100行的列表中选择前10时,无法保证将返回哪些行。更改order by子句以包含唯一列。