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;
    }

这个错误可能很愚蠢,但我似乎看不到它......有什么想法吗?

谢谢!

Linq skip 跳过了错误的结果

我关于跳过太多页面的第一个想法是不正确的。看起来您混淆了总数:

var total = _context.SupplierReview.Count();

然后是与您的 company.ID 匹配的计数:

Where(x => x.Company.Id == companyId)

我觉得total计算应该包括这个Where?看看你的else状况。如果您.Take(total - skipAmount),并且计算总数时不考虑您的公司 ID,您最终将尝试获取太多,可能不存在金额。

可以为

SkipTake扩展方法指定大于(实际)集合计数的数字,在这种情况下,您将获得一个空集合。

这意味着我们可以优化代码,如下所示。

 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();