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