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"
Esta solución funcionó para mí. http://www.dotnetfunda.com/articles/article1995-rownumber-simulation-in-linq.aspx
.Select((x, index) => new
{
SequentialNumber = index + 1
,FieldFoo = x.FieldFoo
}).ToList();
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>();
}
}