Question

J'utilise LINQ pour interroger un dictionnaire générique, puis j'utilise le résultat comme source de données pour mon ListView (WebForms).

Code simplifié :

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

Je pensais que ça marcherait mais en fait ça jette un System.InvalidOperationException:

ListView avec ID 'MyListView' doit avoir une source de données qui implémente Icollection ou peut effectuer un paginage de source de données si le permis de permettre est vrai.

Pour le faire fonctionner, j'ai dû recourir aux solutions suivantes :

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

Y a-t-il un petit piège dans le premier exemple pour que cela fonctionne ?

(Je ne savais pas quoi utiliser comme titre de question pour celle-ci, n'hésitez pas à le modifier pour quelque chose de plus approprié)

Était-ce utile?

La solution

Essaye ça:

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

Sachez que cela créera essentiellement une nouvelle liste à partir de la collection Values ​​d'origine, et donc toute modification apportée à votre dictionnaire ne sera pas automatiquement reflétée dans votre contrôle lié.

Autres conseils

J'ai tendance à préférer utiliser la nouvelle syntaxe Linq :

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

Pourquoi obtenez-vous un dictionnaire alors que vous n'utilisez pas la clé ?Vous payez ces frais généraux.

Vous pouvez également essayer :

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

Fondamentalement, les collections génériques sont très difficiles à diffuser directement, vous n'avez donc pas vraiment d'autre choix que de créer un nouvel objet.

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

Le simple fait d'ajouter des connaissances à la phrase suivante ne récupère aucune donnée de la base de données.Créez simplement la requête (pour cela, elle est de type iquerable).Pour lancer cette requête vous devez ajouter .ToList() ou .First() à la fin.

dict.Values.Where(rec => rec.Name == "foo")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top