【问题标题】:LINQ query to order elements between two variablesLINQ 查询以对两个变量之间的元素进行排序
【发布时间】:2021-09-28 18:54:32
【问题描述】:

这里是一个完整的初学者。
我正在尝试创建一个 JSONResult,我试图在两个变量之间返回它。 这是操作:

public JsonResult GetVoices(int? PageNumber, int? PageSize)
        {
            var StartRow = ((PageNumber - 1) * PageSize) + 1;
            var EndRow = PageNumber * PageSize;
            var i = 0;
            var data = (from a in db.Content
                        select new
                        {
                            RowNumber = i++,
                            Id = a.Id,
                            Title = a.Title,
                            Description = a.Description,
                            CreatedAt = a.CreatedAt
                        }).ToList();
            return Json(data, JsonRequestBehavior.AllowGet);
        }

如您所见,有两个参数最终指定开始和结束的行。我希望所有返回的 RowNumber 都在 StartRow 和 LastRow 之间

【问题讨论】:

  • 查找有关 LINQ + Paging 的问题,并了解如何使用 Skip/Take。
  • 谢谢,看了一下,好像可以解决问题

标签: json asp.net-mvc linq


【解决方案1】:

你正在寻找这样的东西:

public JsonResult GetVoices(int PageNumber, int PageSize) =>
    Json((from a in db.Content.ToArray()
         let StartRow = ((PageNumber - 1) * PageSize) + 1
         let EndRow = PageNumber * PageSize
         from RowNumber in Enumerable.Range(StartRow, EndRow - StartRow + 1)
         select new
         {
             RowNumber = RowNumber,
             Id = a.Id,
             Title = a.Title,
             Description = a.Description,
             CreatedAt = a.CreatedAt
         }).ToList(), JsonRequestBehavior.AllowGet);

【讨论】:

    【解决方案2】:

    所以您有一个PageSize 和一个PageNumber,并且您希望页面上的所有行都带有PageNumber

    • 第 0 页包含第 0 行到 PageSize - 1
    • 第 1 页包含行 PageSize 到 2 * PageSize - 1
    • 第 2 页包含第 2 行 * PageSize 到 3 * PageSize - 1

    这似乎是一个很常见的问题,所以我们不要只局限于这个问题的解决方案,让我们制定一个适合所有需要划分到pages的序列的解决方案。

    我的建议是创建一个 IQueryable<T> 的扩展方法,这样您就可以将分页与其他 LINQ 方法交织在一起。如果你对扩展方法不熟悉,可以考虑阅读Extension Methods Demystified

    输入:一系列相似项目:IQueryable<T>PageSizePageNumber

    输出:页面PageNumber上的所有行,根据上面的定义。因此,除了最后一页之外,每一页都有PageSize 的行数。最后一页将有Total number of rows % PageSize

    我决定返回IQueryable<T>,而不是ICollection<T>。这样做的好处是,如果您不枚举页面上的行,则不会获取数据。缺点是你必须计算每页的行数,以及页数。如果您认为您将始终枚举所有页面上的所有行,请考虑返回 ICollection<T>

    public IQueryable<T>> FetchPage<T>(
        this IQueryable<T> source,
        int pageNumber,
        int pageSize)
    {
        // TODO: check input parameters: source not null, pageSize > 0, pageNumber >= 0
    
        return source.Skip(pageNumber * pageSize)
                     .Take(pageSize);
    }
    

    用法:如果您有一个产品表,并且您想将其划分为大小为 25 的页面,并且您想获取第 3 页,首先是最便宜的产品:

    IQueryable<Product> productsOnPage3 = dbContext.Products
        .OrderBy(product => product.Price)
        .FetchPage(3, 25)
        .ToList();
    

    如果您不希望页面上出现完整的行,可以添加Select

    考虑创建带有参数selector 的扩展方法,就像在 LINQ Select 中一样:

    public IQueryable<T>> FetchPage<T>(
        this IQueryable<T> source,
        int pageNumber,
        int pageSize,
        Expression<Func<TSource,TResult>> selector)
    {
        // TODO: check input parameter selector
    
        return source.FetchPage(pageNumber, pageSize)
                     .Select(selector);
    }
    

    也许还有一个 sortKey 的重载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 2021-05-16
      • 2016-10-27
      • 1970-01-01
      • 2023-01-26
      • 1970-01-01
      相关资源
      最近更新 更多