是否可以查询ExpandoObject列表?

我想知道是否可以使用常规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(); foreach (var item in items) { var modifiedItem = new List<KeyValuePair> { new KeyValuePair("Id", item.Id), new KeyValuePair("FileId", item.FileId), new KeyValuePair("Notes", item.Notes) }; modifiedItem.AddRange(item.Fields.Select(field => new KeyValuePair(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? 

我不认为这是相关的,但这是我的ConvertToExpandoObjectsfunction

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

我试着简单地做一些像generatedItems.Where(x => x.); 但显然它没有给我任何工作,因为它不知道这些对象有Id等。

那么有可能查询它,如果是,那么如何?

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

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

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

如果您的代码取决于其中一个对象是否具有可选属性(例如,某些对象具有“标题”,而其他对象没有),则需要更多的手工劳动。

 if((generatedItems as IDictionary).ContainsKey("Title")) { }