Метод расширения в предложении where в linq to Entities

В linq to Entities нам нужен метод, который работает как "как в sql". Мы реализовали наш собственный метод расширения для IQueryable, потому что метод contains не работает для нас, потому что не принимает шаблоны, такие как '%a%b%'

Созданный код:

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. Я предполагаю, что мне нужно преобразовать возвращаемое Expression методом BuildLinqExpression в bool, но я не знаю, как это сделать

Подведем итоги! Во-первых, можно ли создавать собственные расширенные методы в Linq to Entities, которые выполняют код в SqlServer? если это возможно, как я должен это сделать?

Спасибо за помощь.

5
задан Marc Cals 23 May 2012 в 10:44
поделиться