首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序列中具有重复值的LINQ to SQL SkipWhile实现

问排序列中具有重复值的LINQ to SQL SkipWhile实现
EN

Stack Overflow用户
提问于 2012-02-22 21:15:33
回答 1查看 523关注 0票数 0

我有一个按降级排序的文章列表。如果评级相同,则按ID升序排序(ID是唯一的):

代码语言:javascript
复制
ID      RATING
9       34
3       32
6       32
8       32
12      32
1       25
2       23

我想查询3篇文章的页面,这意味着第一页将有文章9,3和6。这是通过查询排序列表中排名前3的文章来完成的。

现在,我想从第8篇文章开始,使用文章ID作为从哪里继续的标记,而不是只跳过前3篇文章。这是因为文章表的内容变化非常快,标准的分页方法如下:

代码语言:javascript
复制
var articles = 
    db.Articles
    .OrderByDescending(a => a.Rating).ThenBy(a => a.Id)
    .Skip(3)
    .Take(3);

不会可靠地工作,因为文章可以在任何时候添加或删除(只要假设评分在这里没有变化)。

如果这是LINQ to Object,我可以使用SkipWhile

代码语言:javascript
复制
var articles = 
    db.Articles
    .OrderByDescending(a => a.Rating).ThenBy(a => a.Id)
    .SkipWhile(a => a.Article.Id != 8)
    .Take(3);

但是在LINQ to SQL中没有实现SkipWhile (参见here)。

如果我喜欢这样的话:

代码语言:javascript
复制
var articles = 
    db.Articles
    .Where(a => a.Rating 
             < db.Articles.Single(aa => aa.Id == 8).Rating)
    .OrderByDescending(a => a.Rating)
    .Take(3);

我会跳过第12篇文章,而如果我这样做:

代码语言:javascript
复制
var articles = 
    db.Articles
    .Where(a => a.Rating 
             <= db.Articles.Single(aa => aa.Id == 8).Rating)
    .OrderByDescending(a => a.Rating)
    .Take(3);

我会把第三条和第六条读两遍。

使用LINQ to SQL,使用文章ID作为从何处恢复分页的标记,从第8篇文章恢复分页的最佳方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-22 21:18:48

你能不能这样做:

代码语言:javascript
复制
var articles = 
db.Articles
.OrderByDescending(a => a.Rating).ThenBy(a => a.Id)
.Skip(3)
.Take(3);

好吧,如果这不起作用,我会写一个类似这样的函数:

代码语言:javascript
复制
    static IEnumerable<Article> GetArticles(List<Article> articles, int articlesToRetrieve, int startingID)
    {
        IEnumerable<Article> results = null;
        results = articles.OrderByDescending(a => a.Rating).ThenBy(a => a.ID);

        if (startingID > 0)
        {
            int lastRating = articles.Single(aa => aa.ID == startingID).Rating;
            results = results.Where(a => a.Rating < lastRating || (a.Rating == lastRating && a.ID > startingID));
        }

        if (articlesToRetrieve > 0)
        {
            results = results.Take(articlesToRetrieve);
        }
        return results;
    }

我想这将会起到作用。

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

https://stackoverflow.com/questions/9395533

复制
相关文章

相似问题

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