如何使用 C# Lambda 表达式在 MongoDb 中执行全文搜索
How to perform a full text search in MongoDb with C# Lambda expression
有很多关于如何使用 Mongodb Driver Builders 进行全文搜索的答案。
但它有另一种 ORM 方式是 lambda 表达式来过滤查询。
var collection = _mongoContextFactory.GetCollection<Foo>();
collection.FindSync(x => x.Created >= new DateTime());
那么我将如何使用 lambda 进行全文搜索(我使用提供表达式接口的规范模式)
好吧,我试图在 ExpressionFilterDefinition
中找到解决方案(MongodbDriver
将 lambda 表达式转换为此过滤器)但失败了。
因此,lambda 表达式不支持直接全文搜索。我开启了我的想象力并为此任务创建了解决方法。
我为利用全文索引
的 dto 实体制作了摘要 class
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);
}
}
宾果!
有很多关于如何使用 Mongodb Driver Builders 进行全文搜索的答案。 但它有另一种 ORM 方式是 lambda 表达式来过滤查询。
var collection = _mongoContextFactory.GetCollection<Foo>();
collection.FindSync(x => x.Created >= new DateTime());
那么我将如何使用 lambda 进行全文搜索(我使用提供表达式接口的规范模式)
好吧,我试图在 ExpressionFilterDefinition
中找到解决方案(MongodbDriver
将 lambda 表达式转换为此过滤器)但失败了。
因此,lambda 表达式不支持直接全文搜索。我开启了我的想象力并为此任务创建了解决方法。 我为利用全文索引
的 dto 实体制作了摘要 class 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);
}
}
宾果!