5

我想知道是否可以使用常规 LINQ 查询 ExpandoObject?原因是我有动态 ExpandoObject 但我需要做一些查询才能进一步通过。

它具有一些始终保持不变的属性,例如IdNotes但也有一些我无法控制的动态属性。

这是我的清单的样子

[
  {
    "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等等。

那么是否可以查询它,如果可以,那么如何查询呢?

4

1 回答 1

6

您的建议是正确的,您将能够使用点符号查询动态对象的集合。

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

但是,请记住,这里没有类型安全,正如您所说,IntelliSense 没有用,因为您使用的是动态对象。

如果您的代码取决于其中一个对象是否具有可选属性(例如,一些具有“标题”,而另一些则没有),那么它将需要更多的体力劳动。

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

}
于 2013-09-11T17:24:55.633 回答