34

行番号をlinqクエリの結果セットに投影するにはどうすればよいですか。

言う代わりに:

フィールド1、フィールド2、フィールド3

フィールド1、フィールド2、フィールド3

をお願いします:

1、フィールド1、フィールド2、フィールド3

2、フィールド1、フィールド2、フィールド3

これが私の試みです:

public List<ScoreWithRank> GetHighScoresWithRank(string gameId, int count)
{
    Guid guid = new Guid(gameId);
    using (PPGEntities entities = new PPGEntities())
    {
        int i = 1;
        var query = from s in entities.Scores
                    where s.Game.Id == guid
                    orderby s.PlayerScore descending
                    select new ScoreWithRank()
                    {
                        Rank=i++,
                        PlayerName = s.PlayerName,
                        PlayerScore = s.PlayerScore
                    };
        return query.ToList<ScoreWithRank>();
    }
}

残念ながら、「Rank=i++」行は次のコンパイル時例外をスローします。

「式ツリーには代入演算子が含まれていない可能性があります」

4

5 に答える 5

55

最も簡単な方法は、データベース側ではなくクライアント側で実行し、インデックスも提供する Select のオーバーロードを使用することです。

public List<ScoreWithRank> GetHighScoresWithRank(string gameId, int count)
{
    Guid guid = new Guid(gameId);
    using (PPGEntities entities = new PPGEntities())
    {
        var query = from s in entities.Scores
                    where s.Game.Id == guid
                    orderby s.PlayerScore descending
                    select new
                    {
                        PlayerName = s.PlayerName,
                        PlayerScore = s.PlayerScore
                    };

        return query.AsEnumerable() // Client-side from here on
                    .Select((player, index) => new ScoreWithRank()
                            {
                                PlayerName = player.PlayerName,
                                PlayerScore = player.PlayerScore,
                                Rank = index + 1;
                            })
                    .ToList();

    }
}
于 2008-12-13T11:39:31.277 に答える
1

わかりました、それでうまくいきました。ありがとう。

これが私の最終的なコードです...

サーバ:

public List<Score> GetHighScores(string gameId, int count)
{
    Guid guid = new Guid(gameId);
    using (PPGEntities entities = new PPGEntities())
    {
        var query = from s in entities.Scores
                    where s.Game.Id == guid
                    orderby s.PlayerScore descending
                    select s;
        return query.ToList<Score>();
    }                                                                      
}

クライアント:

void hsc_LoadHighScoreCompleted(object sender, GetHighScoreCompletedEventArgs e)
{
    ObservableCollection<Score> list = e.Result;

    _listBox.ItemsSource = list.Select((player, index) => new ScoreWithRank()
                            {
                                PlayerName = player.PlayerName,
                                PlayerScore = player.PlayerScore,
                                Rank = index+=1
                            }).ToList();
}
于 2008-12-13T12:09:37.957 に答える
0

このソリューションは私にとってはうまくいきました。 http://www.dotnetfunda.com/articles/article1995-rownumber-simulation-in-linq.aspx

.Select((x, index) => new
{
     SequentialNumber = index + 1
    ,FieldFoo = x.FieldFoo                        
}).ToList();
于 2013-02-03T12:56:14.120 に答える
0

また、元のコードをわずかに調整して機能させることもできます。オブジェクトに再度データバインドまたはアクセスすると、ランクは毎回増加します。そのような場合、一番上の答えがより良いです。

let Rank = i++

Rank.ToString()

完全なコード:

public List<ScoreWithRank> GetHighScoresWithRank(string gameId, int count)
{
Guid guid = new Guid(gameId);
using (PPGEntities entities = new PPGEntities())
{
    int i = 1;
    var query = from s in entities.Scores
                let Rank = i++
                where s.Game.Id == guid
                orderby s.PlayerScore descending
                select new ScoreWithRank()
                {
                    Rank.ToString(),
                    PlayerName = s.PlayerName,
                    PlayerScore = s.PlayerScore
                };
    return query.ToList<ScoreWithRank>();
}

}

于 2012-02-03T18:39:37.267 に答える