Frage

Ich verwende LINQ, um ein generisches Wörterbuch abzufragen und das Ergebnis dann als Datenquelle für meine ListView (WebForms) zu verwenden.

Vereinfachter Code:

Dictionary<Guid, Record> dict = GetAllRecords();
myListView.DataSource = dict.Values.Where(rec => rec.Name == "foo");
myListView.DataBind();

Ich dachte, das würde funktionieren, aber tatsächlich wirft es einen System.InvalidOperationException:

ListView mit der ID 'myListView' muss über eine Datenquelle verfügen, die entweder implementiert ICollection oder kann Datenquellen-Paging, wenn AllowPaging auf STIMMT.

Um es zum Laufen zu bringen, musste ich auf Folgendes zurückgreifen:

Dictionary<Guid, Record> dict = GetAllRecords();
List<Record> searchResults = new List<Record>();

var matches = dict.Values.Where(rec => rec.Name == "foo");
foreach (Record rec in matches)
    searchResults.Add(rec);

myListView.DataSource = searchResults;
myListView.DataBind();

Gibt es im ersten Beispiel einen kleinen Haken, damit es funktioniert?

(Ich war mir nicht sicher, was ich als Fragetitel für diese Frage verwenden soll. Sie können ihn gerne in einen passenderen Titel ändern.)

War es hilfreich?

Lösung

Versuche dies:

var matches = dict.Values.Where(rec => rec.Name == "foo").ToList();

Beachten Sie, dass dadurch im Wesentlichen eine neue Liste aus der ursprünglichen Values-Sammlung erstellt wird und daher Änderungen an Ihrem Wörterbuch nicht automatisch in Ihrem gebundenen Steuerelement widergespiegelt werden.

Andere Tipps

Ich bevorzuge die Verwendung der neuen Linq-Syntax:

myListView.DataSource = (
    from rec in GetAllRecords().Values
    where rec.Name == "foo"
    select rec ).ToList();
myListView.DataBind();

Warum erhalten Sie ein Wörterbuch, wenn Sie den Schlüssel nicht verwenden?Sie zahlen für diesen Overhead.

Sie könnten auch Folgendes versuchen:

var matches = new List<Record>(dict.Values.Where(rec => rec.Name == "foo"));

Grundsätzlich ist es sehr schwierig, generische Sammlungen direkt umzuwandeln, sodass Sie kaum eine andere Wahl haben, als ein neues Objekt zu erstellen.

myListView.DataSource = (List<Record>) dict.Values.Where(rec => rec.Name == "foo");

Durch einfaches Hinzufügen von Wissen im nächsten Satz werden keine Daten aus der Datenbank wiederhergestellt.Erstellen Sie einfach nur die Abfrage (dafür ist es ein abfragbarer Typ).Um diese Abfrage zu starten, müssen Sie am Ende .ToList() oder .First() hinzufügen.

dict.Values.Where(rec => rec.Name == "foo")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top