如何为Linq select添加唯一的行号? [英] How can I add a unique row number to my Linq select?

查看:713
本文介绍了如何为Linq select添加唯一的行号?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码:

    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的值设置为递增.在另一个选择中,我使用了这个:

Is there a way that I can set the value of Row to increment. In another select I used this:

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

有没有一种方法可以在初次选择时使用类似的东西?

Is there a way I could use something similar for my first select?

更新:

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

I have the following which seems to work but not sure how I can join these two selects:

    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();
    }

推荐答案

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

You can't specify an index-related projection in a query expression, but you could do something like:

    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
           };

请注意,如果不指定任何顺序,则可能会失败-或只是给出不可靠的顺序.

Note that without specifying any ordering, however, this may fail - or just give unreliable ordering.

这篇关于如何为Linq select添加唯一的行号?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆