5 votes

Est-il possible d'interroger la liste des ExpandoObjects ?

Je me demande s'il est possible d'interroger ExpandoObject avec le langage LINQ ordinaire ? La raison est que j'ai un ExpandoObject dynamique mais que j'ai besoin d'effectuer quelques requêtes avant de pouvoir passer à autre chose.

Il a certaines propriétés qui restent toujours, par ex. Id , Notes mais aussi certaines propriétés dynamiques que je ne peux pas contrôler.

Voici à quoi ressemble ma liste

[
  {
    "Id": 1,
    "FileId": 1,
    "Notes": "",
    "1": "12.02.1991"
  },
  {
    "Id": 2,
    "FileId": 2,
    "Notes": "",
    "1": "12.02.1991"
  }
]

Code

Comme vous pouvez le voir, j'ai mes éléments statiques et je m'assure ensuite que les clés dynamiques de chaque élément deviennent les propriétés de cet élément. Dans cet exemple 1 est essentiel et 12.02.1991 est la valeur

var generatedItems = new List<object>();

foreach (var item in items)
{
    var modifiedItem = new List<KeyValuePair<string, object>>
    {
        new KeyValuePair<string, object>("Id", item.Id),
        new KeyValuePair<string, object>("FileId", item.FileId),
        new KeyValuePair<string, object>("Notes", item.Notes)
    };
    modifiedItem.AddRange(item.Fields.Select(field => new KeyValuePair<string, object>(field.Key, field.Value)));

    generatedItems.Add(ConvertToExpandoObjects(modifiedItem)); // Here I construct object from key/value pairs
}

return generatedItems; // Is it possible to query this thing?

Je ne pense pas que ce soit pertinent, mais voici mon ConvertToExpandoObjects funciton.

public static dynamic ConvertToExpandoObjects(IEnumerable<KeyValuePair<string, object>> pairs)
{
    IDictionary<string, object> result = new ExpandoObject();
    foreach (var pair in pairs)
        result.Add(pair.Key, pair.Value);
    return result;
}

J'ai essayé de faire simplement quelque chose comme generatedItems.Where(x => x.); mais évidemment, cela ne me donne rien sur lequel travailler puisqu'il ne sait pas que ces objets ont Id etc.

Est-il donc possible de l'interroger et si oui, comment ?

6voto

dcastro Points 17978

Votre suggestion est juste, vous seriez capable d'interroger une collection d'objets dynamiques en utilisant la notation par points.

var ids = generatedItems.Cast<dynamic>().Select(x => x.Id);

Cependant, gardez à l'esprit qu'il n'y a pas de sécurité de type ici et, comme vous l'avez dit, IntelliSense n'est d'aucune utilité, puisque vous utilisez des objets dynamiques.

Si votre code dépend du fait que l'un de ces objets possède ou non une propriété facultative (par exemple, certains ont "Title", d'autres non), cela nécessitera un peu plus de travail manuel.

if((generatedItems as IDictionary<String, object>).ContainsKey("Title")) {

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X