如何为Linq选择添加唯一的行号?

时间:2012-08-19 08:16:54

标签: c# linq

我有以下代码:

    public IEnumerable<Content.Grid> DetailsBase(string pk)
    {
        var data = contentRepository.GetPk(pk);
        var refType = this.GetRefType(pk);
        var refStat = this.GetRefStat(pk);
        var type = referenceRepository.GetPk(refType);
        var stat = referenceRepository.GetPk(refStat);
        var dataOut =
        from d in data
        join s in stat on d.Status equals s.RowKey into statuses
        from s in statuses.DefaultIfEmpty()
        join t in type on d.Type equals t.RowKey into types
        from t in types.DefaultIfEmpty()
        select new Content.Grid
        {
            PartitionKey = d.PartitionKey,
            RowKey = d.RowKey,
            Order = d.Order,
            Title = d.Title,
            Status = s == null ? "" : s.Value,
            StatusKey = d.Status,
            Type = t == null ? "" : t.Value,
            TypeKey = d.Type
        };
        return dataOut;
    }

和这堂课:

    public class Grid
    {
        public string PartitionKey { get; set; }
        public string RowKey { get; set; }
        // Counter
        public int Row { get; set; }
        //
        public int Order { get; set; }
        public string Title { get; set; }
        public string Status { get; set; }
        public string StatusKey { get; set; }
        public string Type { get; set; }
    }

有没有办法可以将Row的值设置为递增。在另一个选择中我使用了这个:

        return dataIn
            .OrderBy(item => item.Order)
            .Select((t, index) => new Content.Grid()
            {
                PartitionKey = t.PartitionKey,
                RowKey = t.RowKey,
                Row = index + 1,

我有没有办法在第一次选择时使用类似的东西?

更新

我有以下似乎有效,但不确定如何加入这两个选项:

    public IList<Content.Grid> GetContentGrid(string pk)
    {
        var data =
        from d in contentRepository.GetPk(pk)
        join s in referenceRepository.GetPk(this.GetRefStat(pk)) 
        on   d.Status equals s.RowKey into statuses
        from s in statuses.DefaultIfEmpty()
        join t in referenceRepository.GetPk(this.GetRefType(pk))
        on   d.Type equals t.RowKey into types
        from t in types.DefaultIfEmpty()
        select new Content.Grid
        {
            PartitionKey = d.PartitionKey,
            RowKey = d.RowKey,
            Order = d.Order,
            Title = d.Title,
            Status = s == null ? "" : s.Value,
            StatusKey = d.Status,
            Type = t == null ? "" : t.Value,
            TypeKey = d.Type,
            Link = d.Link,
            Notes = d.Notes,
            TextLength = d.TextLength,
            // AuditableTable
            Created = d.Created ?? new DateTime(2012, 1, 1),
            CreatedBy = d.CreatedBy ?? "n/a",
            Modified = d.Modified ?? new DateTime(2012, 1, 1),
            ModifiedBy = d.ModifiedBy ?? "n/a" 
        };
        return data
            .OrderBy(item => item.Order)
            .Select((t, index) => new Content.Grid()
            {
                PartitionKey = t.PartitionKey,
                RowKey = t.RowKey,
                Row = index + 1,
                Order = t.Order,
                Title = t.Title,
                Status = t.Status,
                StatusKey = t.StatusKey,
                Type = t.Type,
                TypeKey = t.TypeKey,
                Link = t.Link,
                Notes = t.Notes,
                TextLength = t.TextLength,
            })
            .ToList();
    }

1 个答案:

答案 0 :(得分:7)

您无法在查询表达式中指定与索引相关的投影,但您可以执行以下操作:

    var dataOut = from d in data
                  join s in stat on d.Status equals s.RowKey into statuses
                  from s in statuses.DefaultIfEmpty()
                  join t in type on d.Type equals t.RowKey into types
                  from t in types.DefaultIfEmpty()
                  select new { d, s, t };
    return dataOut.Select((x, index) => new Content.Grid {
                PartitionKey = x.d.PartitionKey,
                RowKey = x.d.RowKey,
                Order = x.d.Order,
                Title = x.d.Title,
                Status = x.s == null ? "" : x.s.Value,
                StatusKey = x.d.Status,
                Type = x.t == null ? "" : x.t.Value,
                TypeKey = x.d.Type,
                Row = index
           };

请注意,如果没有指定任何排序,这可能会失败 - 或者只是提供不可靠的排序。