Linq skip 跳过了错误的结果
本文关键字:结果 错误 过了 skip Linq | 更新日期: 2023-09-27 18:36:21
我正在使用linq语句来获取公司评论,但它跳过了错误的结果。
如果我传递它当前页面 = 1,它会得到正确的结果,如果我传递它当前页面 2,它会做错。每页的评论量为 10。GUID ID 也会正确传递。
public IList<SupplierReview> GetAmount(int pageAmount, int currentPage, Guid companyId)
{
var total = _context.SupplierReview.Count();
var skipAmount = pageAmount * (currentPage - 1);
if (skipAmount < total)
{
if (pageAmount < (total - skipAmount))
{
//return the page amount of reviews
return _context.SupplierReview
.Where(x => x.Company.Id == companyId)
.OrderBy(x => x.Id)
.OrderBy(x => x.ReviewDate)
.Skip(skipAmount)
.Take(pageAmount)
.ToList();
}
else
{
//if the left amount is less than the pageAmount,
//then only the leftovers should get taken
return _context.SupplierReview
.Where(x => x.Company.Id == companyId)
.OrderBy(x => x.Id)
.OrderBy(x => x.ReviewDate)
.Skip(skipAmount)
.Take(total - skipAmount)
.ToList();
}
}
//if nothings left, return null
return null;
}
这个错误可能很愚蠢,但我似乎看不到它......有什么想法吗?
谢谢!
我关于跳过太多页面的第一个想法是不正确的。看起来您混淆了总数:
var total = _context.SupplierReview.Count();
然后是与您的 company.ID 匹配的计数:
Where(x => x.Company.Id == companyId)
我觉得total
计算应该包括这个Where
?看看你的else
状况。如果您.Take(total - skipAmount)
,并且计算总数时不考虑您的公司 ID,您最终将尝试获取太多,可能不存在金额。
可以为
Skip
和Take
扩展方法指定大于(实际)集合计数的数字,在这种情况下,您将获得一个空集合。
这意味着我们可以优化代码,如下所示。
return _context.SupplierReview
.Where(x => x.Company.Id == companyId)
.OrderBy(x => x.Id)
.OrderBy(x => x.ReviewDate)
.Skip(pageAmount * currentPage) //use currentPage + 1 if index assumed to start with 1
.Take(pageAmount)
.ToList();