所以我正在进行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#循环我不太确定如何用排名来填充这个属性。
答案 0 :(得分:3)
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语句不会更改订单。
答案 1 :(得分:1)
如果“新属性”是指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();
请注意,这并不考虑关系 - 这意味着如果两个用户具有相同的总分,则他们将不具有相同的排名。