Wie kann ich die Zeilennummer auf die Ergebnismenge der linq-Abfrage projizieren?.
Statt zu sagen:
feld1, Feld2, Feld3
feld1, Feld2, Feld3
Ich würde gern:
1 Feld1 Feld2 Feld3
2, Feld1, Feld2, Feld3
Hier ist mein Versuch:
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>();
}
}
Leider gibt die Zeile "Rank = i ++" die folgende Ausnahme während der Kompilierung aus:
"Ein Ausdrucksbaum darf keinen Zuweisungsoperator enthalten."
Nun, der einfachste Weg wäre, dies auf der Clientseite und nicht auf der Datenbankseite zu tun und die Überladung von Select zu verwenden, die auch einen Index bereitstellt:
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, das hat den Trick getan. Vielen Dank.
Hier ist mein endgültiger Code ...
Server:
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>();
}
}
Klient:
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 Spalten = aus t in Lstemp-Reihenfolgevon t.Name select new {Zeilennummer = ++ Srno, EmpID = t.ID, Name = t.Name, City = t.City};
Diese Lösung hat für mich funktioniert. http://www.dotnetfunda.com/articles/article1995-rownumber-simulation-in-linq.aspx
.Select((x, index) => new
{
SequentialNumber = index + 1
,FieldFoo = x.FieldFoo
}).ToList();
Sie können auch nur eine geringfügige Anpassung an den ursprünglichen Code vornehmen, damit er funktioniert. Vorsicht, wenn Sie erneut auf das Objekt zugreifen oder darauf zugreifen, wird der Rang jedes Mal erhöht. In diesen Fällen ist die beste Antwort besser.
let Rank = i++
und
Rank.ToString()
Vollständiger Code:
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>();
}
}