En linq to Entities necesitábamos un método que funcionara como "sql like". Hemos implementado nuestro propio método de extensión a IQueryable, porque contiene método no funciona para nosotros porque no acepta patrones como '% a% b%'Método de extensión en where cláusula en linq a Entidades
El código creado es:
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);
}
Esto funciona correctamente y el código se ejecuta en su totalidad en SqlServer, pero ahora sería utilizar este método de extensión en el interior donde cláusula como:
myDBContext.MyObject.Where(o => o.Description.Like(patternToSearch) || o.Title.Like(patterToSerch));
el problema es que los métodos utilizados en la cláusula where tiene que devolver un resultado booleano, si es lo que solía con operadores como '||' , y no sé cómo hacer que el código que he creado devuelva un bool y mantenga el código ejecutado en sqlserver. Supongo que tengo que convertir el método Expression by BuildLinqExpression devuelto a bool, pero no sé cómo hacerlo
En resumen! En primer lugar, es posible crear nuestros propios métodos de extensión en Linq para las entidades que ejecutan el código en SqlServer. si esto es posible, ¿cómo debo hacerlo?
Gracias por su ayuda.
¿Usted intentó utilizar [ 'SqlMethods.Like'] (http: // MSDN. microsoft.com/en-us/library/system.data.linq.sqlclient.sqlmethods.like.aspx)? – dasblinkenlight
@dasblinkenlight SqlMethods no se puede usar en Linq to Entity. –