5

通常の 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..

それで、それを照会することは可能ですか?もしそうなら、どのように?

4

1 に答える 1

6

あなたの提案は正しいです。ドット表記を使用して動的オブジェクトのコレクションを照会できます。

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

ただし、ここには型の安全性がないことに注意してください。また、動的オブジェクトを使用しているため、IntelliSense は役に立たないことに注意してください。

これらのオブジェクトのいずれかにオプションのプロパティがあるかどうかにコードが依存している場合 (たとえば、"Title" があるものとないものがある) は、もう少し手作業が必要になります。

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

}
于 2013-09-11T17:24:55.633 に答える