Linq and FullTextSearch - Asp.Net

本文关键字:Asp Net FullTextSearch and Linq | 更新日期: 2023-09-27 18:25:07

我知道Linq没有支持FullTextSearch的功能,但我的网站(将Linq用于SQL和Linq)需要使用FullTextSearch。

我觉得我有两个选项可以使用FullTextSearch和Linq,它们是:

  1. 在SQL server中创建一个存储过程,并通过Linq查询SP
  2. 在SQL server中创建一个函数,并在Linq语句中使用该函数

有人对什么更好有意见吗?还是这是一种偏好?

Linq and FullTextSearch - Asp.Net

Linq To SQL中不支持全文。创建一个表值函数并映射它是最好的选择,因为结果可以很容易地作为查询的一部分,而不是查询本身。例如,您可以进一步限制查询,或者应用ORDER BY子句。

如上所述,不直接支持Contains搜索,但有一种方法可以实现它。

它需要手动编写谓词并创建一个Expression.Lambda以供IQueryable使用。

为了使用表达式,我使用了LinqKit.PredicateBuilder(https://www.albahari.com/nutshell/predicatebuilder.aspx)。

//fieldName must be an existing Property of TEntity
public IQueryable<TEntity> Contains<TEntity>(IQueryable<TEntity> source, string fieldName, string criteria)
{
    var predicate = PredicateBuilder.New<TEntity>(true);
    var param = predicate.Parameters[0];
    var member = Expression.Property(param, fieldName);
    var val = string.Concat(criteria, "*'"");
    Expression<Func<string>> valueLambda = () => val;
    MethodInfo methodInfo = typeof(SqlServerDbFunctionsExtensions)
                  .GetMethod("Contains", new [] {typeof(DbFunctions), 
                              typeof(string), typeof(string) });
    var expr = Expression.Call(null, 
                 methodInfo,
                 Expression.Constant(EF.Functions), 
                 member, 
                 valueLambda.Body);
    return source.Where((Expression<Func<TEntity, bool>>)Expression.Lambda(expr, param));
}

如果你不想做一个通用的解决方案,一个更简单的解决方案:

IQueryable<Entity> Contains(string criteria)
{
    return DbContext.Entity.Where(x => EF.Functions.Contains(x.Field, criteria));
}