Sta*_*tan 5 c# linq dynamic expandoobject
我想知道是否可以使用常规LINQ查询ExpandoObject?原因是我有动态ExpandoObject但我需要先进行一些查询才能进一步传递.
它有一些永远保留的属性Id
,Notes
但也有一些我无法控制的动态属性.
这是我的列表看起来像
[
{
"Id": 1,
"FileId": 1,
"Notes": "",
"1": "12.02.1991"
},
{
"Id": 2,
"FileId": 2,
"Notes": "",
"1": "12.02.1991"
}
]
Run Code Online (Sandbox Code Playgroud)
如您所见,我有静态项目,然后确保每个项目动态键都成为该项目属性.在这个例子中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?
Run Code Online (Sandbox Code Playgroud)
我不认为这是相关的,但这是我的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;
}
Run Code Online (Sandbox Code Playgroud)
我试图简单地做一些类似generatedItems.Where(x => x.);
但显然它没有给我任何工作,因为它不知道这些对象有Id
等等.
那么可以查询它,如果是,那么如何?
您的建议是正确的,您可以使用点表示法查询动态对象的集合.
var ids = generatedItems.Cast<dynamic>().Select(x => x.Id);
Run Code Online (Sandbox Code Playgroud)
但是,请记住,这里没有类型安全性,正如您所说,IntelliSense没有用,因为您使用的是动态对象.
如果您的代码取决于其中一个对象是否具有可选属性(例如,某些对象具有"标题",而其他对象没有),则需要更多的手工劳动.
if((generatedItems as IDictionary<String, object>).ContainsKey("Title")) {
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9730 次 |
最近记录: |