MongoDB C # .NET Driver ASP.NET Core Неподдерживаемый фильтр - PullRequest
0 голосов
/ 12 декабря 2018

У меня проблемы с настройкой работы фильтров с драйвером 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 driver version

РЕДАКТИРОВАТЬ 2: Я сделал мой запрос работает с использованием этого:

PartitionedModel<T> item = collection.AsQueryable().FirstOrDefault(filt);

Но я не уверен, что означает использование не асинхронной версии, можеткто-нибудь сказать мне, если это не так или это будет проблемой?

1 Ответ

0 голосов
/ 11 июня 2019

Похоже, что текущая реализация драйвера c # mongo не поддерживает фильтры на основе делегатов.

https://github.com/mongodb/mongo-csharp-driver/blob/da0cff54c67208d979b030abb160f958d3276925/src/MongoDB.Driver/Linq/Translators/PredicateTranslator.cs#L76

Переключатель не содержит регистр ExpressionType.Invoke (тип выражения в фильтре на основе делегата).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...