Как выполнить полнотекстовый поиск в MongoDb с C# лямбда-выражением - PullRequest
1 голос
/ 28 февраля 2020

Существует множество ответов, как получить полнотекстовый поиск с помощью Mongodb Driver Builders. Но у него есть другой способ ORM - лямбда-выражения для фильтрации запросов.

var collection = _mongoContextFactory.GetCollection<Foo>();
collection.FindSync(x => x.Created >= new DateTime());

Итак, как я могу получить полнотекстовый поиск с использованием лямбды (я использую шаблон спецификации, который обеспечивает интерфейс выражения)

1 Ответ

0 голосов
/ 03 марта 2020

Хорошо, я попытался найти решение внутри ExpressionFilterDefinition (MongodbDriver преобразует лямбда-выражение в этот фильтр) и потерпел поражение.

Таким образом, прямой полнотекстовый поиск не поддерживается лямбда-выражением. Я включил свое воображение и создал обходной путь для этой задачи. Я сделал абстрактный класс для объекта dto, который использует полнотекстовый индекс

  public abstract class FullTextSearchEntity
    {
        [BsonElement("$text"), BsonIgnoreIfNull]
        public FullTextSearchOption FullTextSearch { get; set; }
    }

Как вы можете догадаться, FullTextSearchOption повторяет структуру BSON для использования полнотекстового индекса

  public class FullTextSearchOption
    {
        [BsonElement("$search"), BsonIgnoreIfNull]
        private string Search { get; set; }

        public FullTextSearchOption(string search)
        {
            Search = search;
        }
    }

И, наконец, я добавил спецификацию для использования этого обходного пути:

  public class FullTextSearchSpecification<T> : SpecificationBase<T> where T: FullTextSearchEntity
    {
        private readonly string _searchQuery;

        public FullTextSearchSpecification(string searchQuery)
        {
            _searchQuery= searchQuery;
        }

        public override Expression<Func<T, bool>> ToExpression()
        {
            return entity=> entity.FullTextSearch == new FullTextSearchOption(_searchQuery);
        }
    }

Корзина go!

...