2014-10-06 1 views
0

У меня возникла проблема с запросом 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, чья коллекция «collection1» содержит, по меньшей мере, один экземпляр класса С чьей собственности «prop1» равно «val1».

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

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

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

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».

+0

Это не полный ответ, следовательно комментарий. Первый параметр ElemMatch здесь - это только свойство/поле ... Вы добавили OfType, поэтому мы понятия не имеем, чего вы хотите. Мне нужно подумать о следующей части, но это немного проблема. –

+0

Я хочу рассмотреть только те документы из «collection1», которые относятся к типу «C». Следовательно, «OfType» (для отфильтровывания всех тех документов, которые относятся к типу «B») Так или иначе, вот как я мог бы решить эту проблему в EF, например, но здесь это исключение ... – user3664916

+0

Да, я получаю ваше намерение. Я говорю, что первый параметр не является предикатом, а скорее показателем поля, к которому вы хотите применить оператор $ elemMatch. OfType не может быть отображен в поле. Как получить предикат, есть вторая проблема, которую можно решить с помощью $, и я думаю. –

ответ

0

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

builder => builder.EQ(nameof(C.prop1), "val1");