分页输出。 LINQ,Skip()和Take()

时间:2019-07-08 16:28:24

标签: c# entity-framework linq output

如果这样做,我会得到两项:

private int page = 0;
private int size = 2;

List<ContractTableRow> rows =
    (from c in model.Contracts
     join w in model.Workers on c.Worker equals w.Id
     where c.Worker == w.Id
     select new ContractTableRow
     {
        ...
     })
     .Skip(page * size)
     .Take(size)
     .ToList();

如果我得到所有物品,则:

List<ContractTableRow> rows =
      (from c in model.Contracts
       .Skip(page * size)
       .Take(size)
       join w in model.Workers on c.Worker equals w.Id
       where c.Worker == w.Id
       select new ContractTableRow
       {
          ...
       })
       .ToList();

第二个代码为什么不给出两个元素?

第一个代码的顺序是什么?首先用select new ContractTableRow所有元素,然后skiptake?还是最初是skiptake,然后是select

我需要它来创建数据库的记录的分页输出。用这种方式实现是正确的吗?

1 个答案:

答案 0 :(得分:1)

正确的方法是,首先取消join并使用Navigation属性,然后正确的顺序是IQueryable.OrderBy。[ThenBy。] Skip.Take.Select。而且您必须提供一个可以完全对结果进行排序的OrderBy,否则您的页面可能会有空白和重叠。

List<ContractTableRow> rows =
       db.Contracts
         .OrderBy( r => r.Id )
         .Skip(page * size)
         .Take(size)
         .Select( c => new ContractTableRow
           {
              c.Id,
              c.Worker.Name...
           })
         .ToList();