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) を定義するか、その追加のプロパティまたは 2 つのプロパティ (ランクとオブジェクト) を使用して匿名型を使用する必要があります。

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

これは同点を考慮していないことに注意してください。つまり、2 人のユーザーの合計ポイントが同じ場合、同じランクにはなりません。

于 2013-03-20T15:16:33.683 に答える