繁体   English   中英

如何限制显示的行数

[英]How do I limit the number of rows displayed

我构造以下查询以显示来自 Json 的数据。假设此查询返回 50 行。 但我只想显示前 10 行。
在这种情况下, select top 10limit 10名的等价物是什么。 谢谢你。

List<Item> result = items.GroupBy(x => x.ItemNo)
       .Select(x => new Item
        {
            ItemNo = x.Key,
            ItemName = x.FirstOrDefault(y => y.Key == "ItemName")?.Value,           
            Date = x.FirstOrDefault(y => y.Key == "Date")?.Value
        }).OrderByDescending(y => y.date)
.ToList();

我认为您正在寻找的方法是 Take

取自微软网站的方法

最后我认为你的代码应该是这样的:

List<Item> result = items.GroupBy(x => x.ItemNo)
   .Select(x => new Item
    {
        ItemNo = x.Key,
        ItemName = x.FirstOrDefault(y => y.Key == "ItemName")?.Value,           
        Date = x.FirstOrDefault(y => y.Key == "Date")?.Value
    }).OrderByDescending(y => y.date).Take(10).ToList();

在对数据管道的任何查询中,您都不应请求该批次。 为什么? 您不知道查询中有多少条记录。 您可能认为只有几行,但如果DBAdmin做错了什么,客户表中可能有 1000 万行。

因此,使用 Request 查询 object 来请求您的数据,其中包含一些默认设置的边界条件值。

public record ListQueryRequest {

    public int StartIndex { get; init; } = 0;

    public int PageSize { get; init; } = 1000;
}

然后,您的数据管道服务可以执行以下操作:

private async ValueTask<ListRequestResult<TRecord>> GetItemsAsync<TRecord>(ListQueryRequest listQuery)
{

   using var dbContext = this.factory.CreateDbContext();
   dbContext.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

   IQueryable<TRecord> query = dbContext.Set<TRecord>();

   /.... any IQueryable conditions such as filtering or ordering

   query = query
     .Skip(listQuery.StartIndex)
     .Take(listQuery.PageSize);
   

  // delayed execution of the query
   var list = await query.ToListAsync(); 
  
   // build and return your request result
}

结果 object 模板如下所示:


public record ListQueryResult<TRecord>
{
   public bool Successful {get; init;}
   public string Message {get; init;}
   public IEnumerable<TRecord> Items {get; init;}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM