我使用以下代码查询我的数据库:
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页中结束,我甚至无法理解为什么。我已经检查了我的数据库中是否有重复的行,没有。我已经检查过,以确保每一行的URL、和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;
}有人遇到过这样的事吗?我的查询是否有不同的形式来做我想要做的事情?我不知道我会错过什么。
发布于 2009-04-05 18:06:18
在第一种情况下,您要排序的Rep列可能包含重复项。当您从包含值为1的100行的列表中选择top 10时,无法保证返回哪些行。更改order子句以包含唯一列。
https://stackoverflow.com/questions/719387
复制相似问题