Можно ли запросить список ExpandoObject?

Интересно, можно ли запросить ExpandoObject с помощью обычного LINQ? Причина в том, что у меня есть динамический ExpandoObject, но мне нужно сделать несколько запросов, прежде чем я смогу пройти дальше.

У него есть некоторые свойства, которые всегда остаются, например. Id, Notes, а также некоторые динамические свойства, которыми я не могу управлять.

Вот как выглядит мой список из них

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

Код

Как видите, у меня есть свои статические элементы, а затем я удостоверяюсь, что динамические ключи каждого элемента становятся свойствами этого элемента. В этом примере 1 — ключ, а 12.02.1991 — значение

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?

Я не думаю, что это актуально, но вот моя функция ConvertToExpandoObjects.

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

Я попытался просто сделать что-то вроде generatedItems.Where(x => x.);, но, очевидно, мне не над чем работать, поскольку он не знает, что эти объекты имеют Id и т. д.

Так можно ли его запросить и если да, то как?


person Stan    schedule 11.09.2013    source источник


Ответы (1)


Ваше предложение верно, вы сможете запросить набор динамических объектов, используя точечную запись.

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

Однако имейте в виду, что здесь нет безопасности типов, и, как вы сказали, IntelliSense бесполезен, поскольку вы используете динамические объекты.

Если ваш код зависит от того, имеет ли один из этих объектов необязательное свойство (например, у некоторых есть «Заголовок», а у других нет), тогда потребуется немного больше ручного труда.

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

}
person dcastro    schedule 11.09.2013
comment
Нет, это невозможно, потому что это object, а object не имеет определения для Id. (ошибка времени компиляции) - person Stan; 11.09.2013
comment
Я не заметил, что это был список объектов. Я изменил свой ответ. - person dcastro; 11.09.2013
comment
Без проблем. Я бы подумал об изменении определения списка на List<dynamic>, чтобы не приходилось приводить все его элементы каждый раз, когда вам нужно с ними работать. - person dcastro; 11.09.2013