Linq and FullTextSearch - Asp.Net
本文关键字:Asp Net FullTextSearch and Linq | 更新日期: 2023-09-27 18:25:07
我知道Linq没有支持FullTextSearch的功能,但我的网站(将Linq用于SQL和Linq)需要使用FullTextSearch。
我觉得我有两个选项可以使用FullTextSearch和Linq,它们是:
- 在SQL server中创建一个存储过程,并通过Linq查询SP
- 在SQL server中创建一个函数,并在Linq语句中使用该函数
有人对什么更好有意见吗?还是这是一种偏好?
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));
}