У меня проблемы с настройкой работы фильтров с драйвером MongoDB .NET, я получаю эту ошибку:
Unsupported filter: Invoke(value(System.Func2 [Role,System.Boolean]), {document}{Model}).
При попытке запустить этот код:
public virtual async Task<PartitionedModel<T>> GetByAsync(Func<T, bool> filter)
{
Expression<Func<PartitionedModel<T>, bool>> filt = (i) => filter(i.Model);
PartitionedModel<T> item = (await collection.FindAsync(filt)).FirstOrDefault();
return item;
}
и класс PartitionedModel выглядят следующим образом:
public class PartitionedModel<T> where T : IModel
{
public ObjectId Id { get; set; }
public PartitionOffset PartitionOffset { get; set; }
public T Model { get; set; }
}
Я сделал рефакто моего кода, работая с тем, чтобы коллекции обрабатывали IModel непосредственно для работы с PartitionedModel , который является классом хранения для моей IModel , функция GetByAsync работала правильно, прежде чем я подклассифицировал IModel
Я нашелИнформация об этой проблеме практически отсутствует, кроме этой: Динамический предикат Linq выдает ошибку «Неподдерживаемый фильтр» с драйвером C # MongoDB
Но похоже, что моя версия драйвера C # MongoDB не принимает Func <> в параметре в качестве фильтра, я могу только передать Builder <> или Expression <> в качестве фильтра в функции поиска
Может кто-топросветите меня немного об этой ошибке?
РЕДАКТИРОВАТЬ:
Я попытался запустить этот код, заменив FindAsync(filt)
на FindAsync(_ => true)
, и он на самом деле работает
Кроме того, вот код, которыйиспользуется для извлечения коллекции
protected readonly IMongoCollection<PartitionedModel<T>> collection;
public GenericRepository(IMongoDatabase dbContext, string collectionName)
{
collection = dbContext.GetCollection<PartitionedModel<T>>(collectionName);
}
, и версия моего драйвера выглядит так: 2.7.0
РЕДАКТИРОВАТЬ 2: Я сделал мой запрос работает с использованием этого:
PartitionedModel<T> item = collection.AsQueryable().FirstOrDefault(filt);
Но я не уверен, что означает использование не асинхронной версии, можеткто-нибудь сказать мне, если это не так или это будет проблемой?