首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用orderby、Skip()和带LINQ ()时重复行

在使用orderby、Skip()和带LINQ ()时重复行
EN

Stack Overflow用户
提问于 2009-04-05 18:01:30
回答 3查看 3.1K关注 0票数 5

我使用以下代码查询我的数据库:

代码语言:javascript
运行
复制
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子句中使用的第一个方法不同,完全按照预期工作。

代码语言:javascript
运行
复制
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;
}

有人遇到过这样的事吗?我的查询是否有不同的形式来做我想要做的事情?我不知道我会错过什么。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-04-05 18:05:15

当您说您没有任何“重复行”时--返回的任何行是否具有相同的Rep值?如果是这样的话,其中的顺序将是不确定的。

试一试

代码语言:javascript
运行
复制
orderby p.Rep descending, p.SubmitTime

(或将完全确定的其他排序)以获得更可预测的结果。

另外,这是吗?如果是这样的话,您应该查看生成的SQL以查看发生了什么。

票数 10
EN

Stack Overflow用户

发布于 2009-04-05 18:12:46

当我不使用LINQ,而只是使用SELECT查询(在sproc中)时,我对分页中的类似问题感到困惑。我认为问题可能是Rep字段不是唯一的,但是作为日期的SubmitTime字段可能是唯一的。

我建议您在Rep之后再尝试第二个字段,通过始终以相同的顺序返回结果来确定顺序。它可以是使记录唯一的任何字段;您不必在结果中使用它。

票数 2
EN

Stack Overflow用户

发布于 2009-04-05 18:06:18

在第一种情况下,您要排序的Rep列可能包含重复项。当您从包含值为1的100行的列表中选择top 10时,无法保证返回哪些行。更改order子句以包含唯一列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/719387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档