排序列中具有重复值的LINQ to SQL SkippWhile实现
本文关键字:LINQ to SQL 实现 SkippWhile 排序 | 更新日期: 2023-09-27 18:25:20
我有一个按降序排列的文章列表。如果评级相同,则按升序ID排序(ID是唯一的):
ID RATING
9 34
3 32
6 32
8 32
12 32
1 25
2 23
我想查询3篇文章的页面,这意味着第一页将有文章9、3和6。这是通过查询排序列表中排名前三的文章来完成的。
现在,我想从第8篇文章中恢复接下来的3篇文章,使用文章ID作为恢复位置的标记,而不是跳过前3篇文章。这是因为文章表的内容变化非常快,标准的分页方法如下:
var articles =
db.Articles
.OrderByDescending(a => a.Rating).ThenBy(a => a.Id)
.Skip(3)
.Take(3);
不会可靠地工作,因为文章可以随时添加或删除(假设这里的评分没有变化)。
如果这是LINQ to Object,我可以使用SkipWhile
:
var articles =
db.Articles
.OrderByDescending(a => a.Rating).ThenBy(a => a.Id)
.SkipWhile(a => a.Article.Id != 8)
.Take(3);
但是CCD_ 2没有在LINQ to SQL中实现(参见此处)。
如果我喜欢的话:
var articles =
db.Articles
.Where(a => a.Rating
< db.Articles.Single(aa => aa.Id == 8).Rating)
.OrderByDescending(a => a.Rating)
.Take(3);
我会跳过第12条,而如果我做这样的事情:
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,恢复文章8中的分页的最佳方式是什么,使用文章ID作为恢复位置的标记?
你能做吗:
var articles =
db.Articles
.OrderByDescending(a => a.Rating).ThenBy(a => a.Id)
.Skip(3)
.Take(3);
好吧,如果这不起作用,我会写一个类似这样的函数:
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;
}
我认为这会奏效。