web-dev-qa-db-fra.com

Comment projeter un numéro de ligne dans les résultats d'une requête Linq

Comment puis-je projeter le numéro de ligne sur l'ensemble de résultats de la requête linq.

Au lieu de dire:

champ1, champ2, champ3

champ1, champ2, champ3

J'aimerais:

1, champ1, champ2, champ3

2, champ1, champ2, champ3

Voici ma tentative à ceci:

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

Malheureusement, la ligne "Rank = i ++" lève l'exception de compilation suivante:

"Un arbre d'expression ne peut pas contenir d'opérateur d'affectation"

34
Jeff Weber

Le plus simple serait de le faire côté client plutôt que côté base de données et d’utiliser la surcharge de Select qui fournit également un index:

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

    }
}
55
Jon Skeet

Ok, ça a fait l'affaire. Merci.

Voici mon code final ...

Serveur:

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

Client:

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();
}
1
Jeff Weber

Liste Lstemp = GetEmpList (); int Srno = 0; var columns = de t dans Lstemp orderby t.Name sélectionner new {numéro_règle = ++ nom-clé, ID_emp = ID.t, nom = nom.t, Ville = ville.t}

0
Rohit Dodiya

Cette solution a fonctionné pour moi. http://www.dotnetfunda.com/articles/article1995-rownumber-simulation-in-linq.aspx

.Select((x, index) => new
{
     SequentialNumber = index + 1
    ,FieldFoo = x.FieldFoo                        
}).ToList();
0
Onur Bıyık

Vous pouvez également apporter un léger ajustement à votre code d'origine pour le faire fonctionner. Attention, si vous vous connectez à l'objet ou que vous accédez à l'objet à nouveau, le rang incrémentera à chaque fois. Dans ces cas, la meilleure réponse est meilleure.

let Rank = i++

et

Rank.ToString()

Code complet:

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

}

0
shannonlh