【问题标题】:Page-by output. LINQ, Skip() and Take()分页输出。 LINQ、Skip() 和 Take()
【发布时间】:2019-07-08 16:28:24
【问题描述】:

如果这样做,我会得到两件物品:

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

我需要它来创建数据库记录的分页输出。这样实现对吗?

【问题讨论】:

  • 您正在接受 2 个合同,然后将它们与 Worker 一起加入,因此您将获得具有这 2 个合同的所有 Worker,除非存在一对一的相关性,否则可以超过两个
  • 我们无法告诉您这样做是否“正确”。在 Stack Overflow 有限的篇幅中,有很多因素无法回答。如果它有效,并且您没有发现任何性能或安全问题,那么它就是“正确”的......
  • 如果您想逐页执行,请执行 Select((row, index) => new {row = row, index = index}).GroupBy(x => x.索引/大小)
  • 顺序很重要。你的两个查询不一样。在第二个中,您通过 skiptake 限制合同并应用其余标准

标签: c# entity-framework linq output


【解决方案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();

【讨论】:

  • 如果使用select new ContractTableRow - 不编译。作品 - .Select(c =&gt; new ContractTableRow{...})
猜你喜欢
  • 2012-06-12
  • 1970-01-01
  • 2023-03-24
  • 2015-12-30
  • 1970-01-01
  • 2013-11-26
  • 2017-09-20
  • 2013-11-25
  • 2010-10-20
相关资源
最近更新 更多