1

我想翻阅一些记录,但Take()扩展名LINQ没有返回我预期的结果。

public IQueryable<Person> GetPersonBetweenDates(DateTime start, DateTime end)
{
  return dbcontext.Persons.Where(x => x.RegisterDate >= start && x.RegisterDate <= end).Take(20);
}

当我再次运行此方法时,我得到相同的结果。具体是如何Take()工作的?

4

2 回答 2

6

Take如果总数小于 N,该方法返回前 N 条记录(N 是参数)或所有记录。要实现分页,请与 结合使用Skip,指定在获取下一页结果之前要跳过多少条记录。您可能还想提供一些总排序以确保查询每次都以相同的顺序返回结果。

注意:我假设从零开始的分页。

private const int _pageSize = 20;

public IQueryable<Person> GetPersonBetweenDates(DateTime start, DateTime end, int? page)
{
     return dbcontext.Persons
                     .Where(x => x.RegisterDate >= start && x.RegisterDate <= end)
                     .OrderBy(x => x.LastName)
                     .ThenBy(x => x.FirstName)
                     .ThenBy(x => x.Id) // using unique id to force consistent total order
                     .Skip((page ?? 0) * _pageSize)
                     .Take(_pageSize);
}
于 2013-09-07T21:33:22.233 回答
5

.Take在查询中返回指定数量的结果,如果是同一个查询,它通常会返回相同的结果。要解决此问题,您可以使用 和 的组合.Skip.Take更改您每次Skipping 和ing 的号码。Take

private int counter = 0;
public IQueryable<Person> GetPersonBetweenDates(DateTime start, DateTime end)
{
    var results = dbcontext.Persons.Where(x => x.RegisterDate >= start && x.RegisterDate <= end).Skip(counter).Take(20);
    counter += 20;
    return results;
}

请记住,即使没有更多记录,您也可以连续调用它。

或者,您可以缓存查询(如果您没有在每次使用时重新实例化该类):

private IQueryable<Person> qry = dbcontext.Persons.Where(x => x.RegisterDate >= start && x.RegisterDate <= end);
public IQueryable<Person> GetPersonBetweenDates(DateTime start, DateTime end)
{
    qry = qry.Skip(20);
    return qry.Take(20);
}

然而,这两个片段可能还有其他问题——请参阅 tvanfosson 的评论和回答。

于 2013-09-07T21:27:29.677 回答