MongoDB Не удалось определить информацию о сериализации

У меня проблема с запросом Mongodb. Вот классы:

    class A
    { 

    }
    class B : A
    { 

    }
    class C : A
    {
        public string prop1 { get; set; }
    }
    class D
    {
        public List<A> collection1 { get; set; }
    }

И запрос:

   var query1 = Query<D>.ElemMatch(d => d.collection1.OfType<C>(), 
             builder => builder.EQ(c => c.prop1, "val1"));

Короче говоря, я хочу выбрать все экземпляры класса D, чья коллекция «коллекция1» содержит хотя бы один экземпляр класса С, чье свойство «prop1» равно «val1».

Это продолжает выдавать «Невозможно определить информацию о сериализации для выражения» на ровном месте.

Что я делаю не так? Я пытался украсить "A" с помощью BsonKnownTypes(typeof(B), typeof(C)) безрезультатно.

PS: если бы у меня был только один класс A:

    class A
    { 
        public string prop1 { get; set; }
    }
    class D
    {
        public List<A> collection1 { get; set; }
    }

тогда этот код работает и делает именно то, что я хочу:

   var query1 = Query<D>.ElemMatch(d => d.collection1, 
             builder => builder.EQ(c => c.prop1, "val1"));

но это не то, что я хочу, я хочу сохранить «B» и «C», которые наследуются от «A».


person user3664916    schedule 06.10.2014    source источник
comment
Это не полный ответ, поэтому комментарий. Первый параметр ElemMatch здесь — это просто свойство/поле... Вы добавили туда OfType, так что мы понятия не имеем, что вы хотите. Мне нужно подумать о следующей части, но это небольшая проблема.   -  person Craig Wilson    schedule 06.10.2014
comment
Я хочу рассматривать только те документы из collection1, которые относятся к типу C. Следовательно, OfType (чтобы отфильтровать все те документы, которые относятся к типу B). Во всяком случае, именно так я решил бы эту проблему, например, в EF, но здесь это исключение...   -  person user3664916    schedule 06.10.2014
comment
Да, я понял твое намерение. Я говорю, что первый параметр является не предикатом, а индикатором поля, к которому вы хотите применить оператор $elemMatch. OfType не может быть сопоставлен с полем. Как вставить туда предикат — это вторая проблема, которую можно решить с помощью $and, я думаю.   -  person Craig Wilson    schedule 06.10.2014


Ответы (1)


Попробуйте использовать: nameof().

builder => builder.EQ(nameof(C.prop1), "val1");
person Stanislav Prusac    schedule 19.10.2015