2

所以我正在做一个 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# 循环,我不太确定如何用排名填充这个属性。

4

2 回答 2

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 语句不会更改顺序。

于 2013-03-20T15:01:25.033 回答
1

如果通过“新属性”你的意思是LeaderBoardRankid 不是myObject然后没有的属性,你不能这样做。您要么需要定义另一个类(可能是 extends 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();

Note that this does NOT account for ties - meaning if two users have the same total points they will not have the same rank.

于 2013-03-20T15:16:33.683 回答