2016-02-26 103 views
0

我使用linq语句来获取我的公司评论,但它跳过了错误的结果。Linq跳过跳过错误的结果?

如果我通过它currentPage = 1它会得到正确的结果,如果我通过它currentPage 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; 
    } 

错误可能是愚蠢的,但我似乎无法看到它......任何想法?

谢谢!

+0

第二次调用'OrderBy'(在每个查询中)应该是'ThenBy'而不是?第一个'OrderBy'被扔掉了。 – Mephy

回答

0

这是好的指定比(实际)集合更大的号数到两个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(); 
+0

对,测试出来,你是对的!似乎工作得很好......但是,我仍然在我的踪迹中得到错误的结果。我有11条评论,当我打开第2页时,我从第1页得到结果1? – Curator

+0

除非集合在两者之间得到修改,否则应该返回正确的结果,您是否获得了已经作为page1的一部分显示的额外行或一行? –

+0

如果可能的话附上截图,这有助于解决问题。 –

2

我首先想到跳过太多的页面是不正确的。它看起来像你混合了总数:

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

我觉得像total计算应该包括这个Where

var total = _context.SupplierReview.Count();

然后匹配您的company.ID时计数?看看你的else条件。如果你.Take(total - skipAmount),并且总计算不考虑你的公司ID,你最终会试图采取太多,可能不存在的金额。

+0

如果页面是5,我正在跳过40条评论 – Curator

+0

我看,我读得有点太快... – GEEF

+0

因为页面1有1-10 第2页有11-20 – Curator