在linq to Entities中,我們需要一種類似「sql like」的方法。我們已經實現了自己的擴展方法來IQueryable的,因爲contains方法爲我們不行,因爲不接受像模式「%A%B%」linq to Entities中where子句的擴展方法
創建的代碼是:
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子句中使用的方法有,如果是用來返回布爾結果運營商喜歡'||' ,並且我不知道如何使我創建的代碼返回一個布爾值並使代碼在sqlserver中執行。我想我必須通過BuildLinqExpression方法將返回的Expression轉換爲bool,但我不知道如何去做
總結起來!首先,可以在Linq中創建我們自己的擴展方法來執行SqlServer中的代碼?如果這是可能的我該怎麼做呢?
感謝您的幫助。
你有沒有嘗試使用['SqlMethods.Like'(HTTP:// MSDN。 microsoft.com/en-us/library/system.data.linq.sqlclient.sqlmethods.like.aspx)? – dasblinkenlight
@dasblinkenlight SqlMethods不能在Linq to Entity中使用。 –