在linq中的新对象中创建新属性
本文关键字:创建 新属性 属性 linq 对象 新对象 | 更新日期: 2023-09-27 18:05:09
所以我正在做一个linq-to-sql查询和结果来作为IEnumerable。从这个列表中,我为返回的每个结果创建一个新对象。我正在使用的存储过程已经按照我想要的顺序返回了对象。我们有一个排行榜,查询后的结果按降序排列。我遇到问题的部分是我想在新对象的新属性中添加排名。
假设我有这样的代码
var usersSummary = Context.[myStoredProcedure]
return usersSummary.Select(x => new [myObject]
{
UserId = x.UserID,
FirstName = x.FirstName,
LastName = x.LastName,
TotalPoints = x.TotalPoints,
LeaderBoardRank = //this part here
Email = x.Email,
CreatedDate = x.CreatedDate
}).OrderByDescending(x => x.TotalPoints).ToList();
我希望LeaderBoardRank
是他们的排名。它们已经按照排名顺序进行了排序,因此第一个对象是1,第二个是2,依此类推。因为这不是一个普通的c#循环,我不太确定如何填充这个属性与排名。
Select
作为可以使用索引的重载
var usersSummary = Context.[myStoredProcedure]
return usersSummary.Select((x, i) => new [myObject]
{
UserId = x.UserID,
FirstName = x.FirstName,
LastName = x.LastName,
TotalPoints = x.TotalPoints,
LeaderBoardRank = i
Email = x.Email,
CreatedDate = x.CreatedDate
}).OrderByDescending(x => x.TotalPoints).ToList();
创建的对象是否已经是列表中的对象?在这种情况下,您不必创建新对象,只需将值赋给现有对象:
var usersSummary = Context.[myStoredProcedure]
return usersSummary.Select((x, i) =>
{
x.LeaderBoardRank = i;
return x;
}).OrderByDescending(x => x.TotalPoints).ToList();
如果你的列表已经排序了,就没有必要再排序了。select语句不会改变顺序
如果你的"新属性"是指LeaderBoardRank
不是myObject
的属性,那么不,你不能这样做。您要么需要定义另一个类(可能扩展MyObject
),要么使用匿名类型,要么使用该附加属性,要么使用两个属性——秩和对象。
如果LeaderBoardRank
已经是属性,并且您想要添加排序结果的秩,您可以这样做:
var usersSummary = Context.[myStoredProcedure];
return usersSummary.OrderByDescending(x => x.TotalPoints)
.Select((x, i) => new [myObject]
{
UserId = x.UserID,
FirstName = x.FirstName,
LastName = x.LastName,
TotalPoints = x.TotalPoints,
LeaderBoardRank = i
Email = x.Email,
CreatedDate = x.CreatedDate
}).ToList();
请注意,这并没有考虑到平局-这意味着如果两个用户有相同的总积分,他们将不会有相同的排名。