tutorial sintaxis expresiones español ejemplos datos consultas consulta comandos anidadas linq row-number

sintaxis - linq c# tutorial español



Cómo proyectar un número de línea en los resultados de la consulta de Linq (4)

Bueno, la forma más fácil sería hacerlo desde el lado del cliente en lugar de hacerlo desde la base de datos, y usar la sobrecarga de Seleccionar que también proporciona un índice:

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

¿Cómo puedo proyectar el número de fila en el conjunto de resultados de la consulta de linq?

En lugar de decir:

campo1, campo2, campo3

campo1, campo2, campo3

Me gustaría:

1, campo1, campo2, campo3

2, campo1, campo2, campo3

Aquí está mi intento de esto:

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

Desafortunadamente, la línea "Rank = i ++" arroja la siguiente excepción en tiempo de compilación:

"Un árbol de expresiones no puede contener un operador de asignación"



Ok, eso hizo el truco. Gracias.

Aquí está mi código final ...

Servidor:

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

Cliente:

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


También puede hacer un pequeño ajuste en su código original para que funcione. Palabra de advertencia, si conecta o accede al objeto nuevamente, el rango aumentará cada vez. En esos casos, la mejor respuesta es mejor.

let Rank = i++

y

Rank.ToString()

Código completo:

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

}