我正在使用以下代码来查询我的数据库:
private const int PAGE_SIZE = 10; public static IListGetTopImagesForUser(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 IListGetAllImagesForUser(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; }
有没有人碰到这样的事情?我的查询应该采用不同的形式来执行我想要的操作吗?我不确定我能错过什么.
当您说没有任何"重复行"时 - 任何返回的行是否具有相同的Rep值?如果是这样,那里的排序将是不确定的.
尝试
orderby p.Rep descending, p.SubmitTime
(或完全确定的一些其他排序)以获得更可预测的结果.
另外,这是LINQ to SQL吗?如果是这样,您应该查看生成的SQL以查看发生了什么.