У меня есть база данных MongoDB с несколькими коллекциями, каждая из которых хранит объекты определенного типа. Я пытаюсь реализовать функцию универсального выбора для работы на определенной коллекции в зависимости от типа, как в следующем определении:MongoDB с C#: поиск элементов с пользовательским предикатом
object[] Select<T>(Func<T, bool> condition)
Например, если один из типов объектов является Person
класс, я бы Реализовать следующее:
object[] Select<T>(Func<T, bool> condition)
{
if (typeof(T) == typeof(Person))
{
Func<Person, bool> f = (Person p) =>
{
return true;
};
return this.collectionPersons.AsQueryable().Where(p=>f(p)).ToArray();
}
else // ...
}
Этот код компилируется, но когда я пытаюсь запустить его, я получаю System.ArgumentException
с
Additional information: Unsupported filter:
Invoke(value(System.Func`2[Person,System.Boolean]), {document}).
Ознакомившись в документации API у меня создается впечатление, что вообще невозможно использовать лямбда-выражение абстрактного вида (как в приведенном выше примере), но только те, которые поддерживаются FilterDefinitionBuilder
, такие как Gt()
, Eq()
и т. д. Мне любопытно, если я понимаю это правильно или существует возможность запросить коллекцию с абстрактным предикатом (я совершенно новый для драйвера MongoDB C#).
Спасибо Maksim, я попытался реализовать Expression вместо Predicate точно так же, как вы предлагали. Следующая ошибка заключается в том, что я получаю: MongoDB.Driver.Linq.IMongoQueryable 'не содержит определения для «Где» и лучший метод перегрузки расширения. System.Linq.Queryable.Where (System.Linq.IQueryable , System.Linq.Expressions.Expression >) 'имеет некоторые недопустимые аргументы. Я, естественно, не буду запрашивать все элементы таким образом: 'return true;' был просто самым простым случаем, который не работал в любом случае. –
Я пробовал это сейчас, с помощью этого метода у меня есть ответ (я обновил его бит litle), я мог запросить мою коллекцию. –
@AlexKonnen, возможно, вам не хватает какой-либо инструкции? –