2015-05-24 4 views
3

Я сохраняю объект dynamic в моей базе данных, но я также хотел бы получить его как динамический объект. Как это может быть сделано? Я пробовал так:Query mongodb collection as dynamic

public dynamic GetItemById(ObjectId id) 
{ 
    dynamic result = Db.GetCollection<dynamic>("Items").Find(x => x.Id == id).FirstOrDefaultAsync().Result; 
    return result; 
} 

Но это дает мне следующую ошибку:

CS1963 An expression tree may not contain a dynamic operation

Я знаю, что это может быть исправлено с помощью типизированного объекта, а не динамический. Но я не хочу использовать какие-либо типизированные объекты, потому что этот вид побеждает всю цель использования базы данных NoSQL, такой как MongoDB (или, по крайней мере, imho).

Как я могу запросить мои коллекции по Id или любому другому имуществу в этом отношении, используя dynamic объектов?

+0

Какую версию драйвера C# вы используете? AFAIK, драйвер C# <2.0 не поддерживает 'dynamic', но посмотрите [этот ответ] (http://stackoverflow.com/a/21715037/4544845), возможно, это то, что вы ищете - особенно последний комментарий, который упоминает 'ExpandoObject'. –

+0

@ felix-b Я использую 2.0. Вот почему я также смог сохранить «динамический» объект в первую очередь :) Попытался сделать это с помощью «ExpandoObject», но вы также не можете сделать запрос «Filter» с этим. – Vivendi

ответ

6

Вы можете использовать синтаксис на основе строки, так как выражение не дает никаких преимуществ с dynamic в любом случае:

var cursor = db.GetCollection<dynamic>("foo"). 
       Find(Builders<dynamic>.Filter.Eq("_id", someId)); 
+1

Спасибо, это работает fdor me! Но мне пришлось изменить 'dynamic' на' ExpandoObject', чтобы он работал. – Vivendi

+1

_id из возвращаемых объектов не является ObjectId. Любые дополнительные шаги, необходимые для этого? –