problemin将索引字段添加到linq结果中

时间:2018-01-26 10:08:26

标签: c# linq

我需要为我的记录显示序列编号。每页50条记录。

    public List<string[]> InstructionsData(IEnumerable<Assets> InstructionsEntry, int currentUserId)
    {

        return InstructionsEntry.Select((entry,index) => new string[]
        {                  
           (index + 1).ToString(),
            entry.state_Id,                
            entry.batchRef_Id,
            entry.assetCategory_Id,                
            GetAge(entry.age),                
            entry.assetStatus_Id,
            GetStatusTag(entry.recordStatus ??false),
            entry.availbaleQty.ToString(),
            entry.createdBy,

        }).ToList();

上面用于显示索引的代码工作正常。我的问题是当我转到下一页时,索引再次从第一个开始。请帮我继续下一页的索引号。

2 个答案:

答案 0 :(得分:0)

简单:

public List<string[]> InstructionsData(IEnumerable<Assets> InstructionsEntry, int currentUserId, int startIndex)
    {

        return InstructionsEntry.Select((entry,index) => new string[]
        {                  
           (startIndex + index + 1).ToString(),
            entry.state_Id,                
            entry.batchRef_Id,
            entry.assetCategory_Id,                
            GetAge(entry.age),                
            entry.assetStatus_Id,
            GetStatusTag(entry.recordStatus ??false),
            entry.availbaleQty.ToString(),
            entry.createdBy,

        }).ToList();

答案 1 :(得分:0)

我不会争论你的设计选择,比如

  • 为什么需要返回一个字符串数组而不是结构化对象?
  • 或者为什么在必须具有可依赖的唯一标识符时需要索引?

你可能在幕后有非常特殊的原因,但我会试着指出我最终会做些什么来检索分页的索引结果集。

首先,获取资产的分页结果集(或您的用例场景需要的任何内容),拥有关于给定页面的一些元数据(当前页码,页面大小,总记录)

var paged = data.Page(page: 2, size: 5);

然后在前端或显示结果的任何地方,将索引附加到返回的记录(我将显示C#等价物,但您将在您的前端选择技术堆栈中轻松实现相同的结果)

var indexed = paged.Items
    .Select((current, index) =>
    {
        var skipped = (paged.Page - 1) * paged.Size;
        return new
        {
            Index = skipped + index,
            Item = current,
        };
    });

其中分页结果如下所示

public class Paged<T>
{
    public IEnumerable<T> Items { get; set; }
    public int Page { get; set; }
    public int Size { get; set; }
    public int Total { get; set; }
}

public class Asset
{
    public int Id { get; set; }
    public string Name { get; set; }
}

虽然实际的分页机制只适用SkipTake

public static class Extensions
{
    public static Paged<T> Page<T>(this IEnumerable<T> instance, int? page = 1, int? size = 10)
    {
        var items = instance
            .Skip((page.Value - 1) * size.Value)
            .Take(size.Value)
            .ToList();

        return new Paged<T>()
        {
            Page = page.Value,
            Size = size.Value,
            Total = instance.Count() - 1,
            Items = items,
        };
    }
}

检查gist以获取概述代码示例