У меня возникла проблема с запросом 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».
Это не полный ответ, следовательно комментарий. Первый параметр ElemMatch здесь - это только свойство/поле ... Вы добавили OfType, поэтому мы понятия не имеем, чего вы хотите. Мне нужно подумать о следующей части, но это немного проблема. –
Я хочу рассмотреть только те документы из «collection1», которые относятся к типу «C». Следовательно, «OfType» (для отфильтровывания всех тех документов, которые относятся к типу «B») Так или иначе, вот как я мог бы решить эту проблему в EF, например, но здесь это исключение ... – user3664916
Да, я получаю ваше намерение. Я говорю, что первый параметр не является предикатом, а скорее показателем поля, к которому вы хотите применить оператор $ elemMatch. OfType не может быть отображен в поле. Как получить предикат, есть вторая проблема, которую можно решить с помощью $, и я думаю. –