如何为Linq select添加唯一的行号? [英] How can I add a unique row number to my Linq select?
本文介绍了如何为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屋!
查看全文