在LINQ to Entities中,我们需要一个类似于"SQL like"的方法。我们已经实现了自己的扩展方法到IQueryable,因为contains方法对我们不起作用,因为它不接受像'%a%b%'这样的模式。
创建的代码如下:
问题在于where子句中使用的方法必须返回bool结果,如果与' || '等运算符一起使用,我不知道如何使我创建的代码返回bool并保持在sqlserver中执行。我想我必须将BuildLinqExpression方法返回的表达式转换为bool,但我不知道如何做到这一点。
总之!首先,在Linq to Entities中创建自己的扩展方法以在SqlServer中执行代码是否可能?如果可能,我该怎么做?
感谢您的帮助。
创建的代码如下:
private const char WildcardCharacter = '%';
public static IQueryable<TSource> WhereLike<TSource>(this IQueryable<TSource> _source, Expression<Func<TSource, string>> _valueSelector, string _textSearch)
{
if (_valueSelector == null)
{
throw new ArgumentNullException("valueSelector");
}
return _source.Where(BuildLikeExpressionWithWildcards(_valueSelector, _textSearch));
}
private static Expression<Func<TSource, bool>> BuildLikeExpressionWithWildcards<TSource>(Expression<Func<TSource, string>> _valueSelector, string _textToSearch)
{
var method = GetPatIndexMethod();
var body = Expression.Call(method, Expression.Constant(WildcardCharacter + _textToSearch + WildcardCharacter), _valueSelector.Body);
var parameter = _valueSelector.Parameters.Single();
UnaryExpression expressionConvert = Expression.Convert(Expression.Constant(0), typeof(int?));
return Expression.Lambda<Func<TSource, bool>> (Expression.GreaterThan(body, expressionConvert), parameter);
}
private static MethodInfo GetPatIndexMethod()
{
var methodName = "PatIndex";
Type stringType = typeof(SqlFunctions);
return stringType.GetMethod(methodName);
}
这个代码可以正常工作,且完全在SqlServer中执行。但是现在我们想要在where
子句中使用这个扩展方法:
myDBContext.MyObject.Where(o => o.Description.Like(patternToSearch) || o.Title.Like(patterToSerch));
问题在于where子句中使用的方法必须返回bool结果,如果与' || '等运算符一起使用,我不知道如何使我创建的代码返回bool并保持在sqlserver中执行。我想我必须将BuildLinqExpression方法返回的表达式转换为bool,但我不知道如何做到这一点。
总之!首先,在Linq to Entities中创建自己的扩展方法以在SqlServer中执行代码是否可能?如果可能,我该怎么做?
感谢您的帮助。
SqlMethods.Like
了吗? - Sergey Kalinichenko