webentwicklung-frage-antwort-db.com.de

So projizieren Sie eine Zeilennummer in Linq-Abfrageergebnisse

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."

34
Jeff Weber

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

    }
}
55
Jon Skeet

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

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

0
Rohit Dodiya

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();
0
Onur Bıyık

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

}

0
shannonlh