可以查询ExpandoObject的列表吗?

6
我想知道是否可以使用常规的LINQ查询ExpandoObject?原因是我有一个动态的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等属性。
那么,能否查询它,如果可以,怎样查询?
1个回答

7
您的建议是正确的,您可以使用点表示法查询动态对象集合。
var ids = generatedItems.Cast<dynamic>().Select(x => x.Id);

然而,需要注意的是这里没有类型安全性,并且正如你所说,由于使用动态对象,因此 IntelliSense 无法使用。

如果您的代码依赖于这些对象中是否有可选属性(例如,某些对象具有“Title”,其他对象则没有),那么它将需要更多的手动操作。

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

}

不可能的,因为它是object,而且object没有Id的定义。(编译时错误) - Stan
我没有注意到它是一个对象列表。我已经改变了我的答案。 - dcastro
没问题。我会考虑将列表定义更改为List<dynamic>,以避免每次需要使用它们时都必须进行强制转换。 - dcastro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接