Méthode d’extension dans la clause where dans linq to Entities

Dans linq to Entities, nous avions besoin d’une méthode qui fonctionne comme “sql like”. Nous avons implémenté notre propre méthode d’extension à IQueryable, car la méthode contient ne fonctionne pas pour nous car n’accepte pas de modèles tels que ‘% a% b%’

Le code créé est:

private const char WildcardCharacter = '%'; public static IQueryable WhereLike(this IQueryable _source, Expression<Func> _valueSelector, ssortingng _textSearch) { if (_valueSelector == null) { throw new ArgumentNullException("valueSelector"); } return _source.Where(BuildLikeExpressionWithWildcards(_valueSelector, _textSearch)); } private static Expression<Func> BuildLikeExpressionWithWildcards(Expression<Func> _valueSelector, ssortingng _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> (Expression.GreaterThan(body, expressionConvert), parameter); } private static MethodInfo GetPatIndexMethod() { var methodName = "PatIndex"; Type ssortingngType = typeof(SqlFunctions); return ssortingngType.GetMethod(methodName); } 

Cela fonctionne correctement et le code est entièrement exécuté dans SqlServer, mais nous utiliserions maintenant cette méthode d’extension dans la clause where comme:

 myDBContext.MyObject.Where(o => o.Description.Like(patternToSearch) || o.Title.Like(patterToSerch)); 

Le problème est que les méthodes utilisées dans la clause where doivent renvoyer un résultat bool si elles sont utilisées avec des opérateurs tels que ‘||’ , et je ne sais pas comment faire en sorte que le code que j’ai créé retourne un bool et conserve le code exécuté dans sqlserver. Je suppose que je dois convertir la méthode Expression by BuildLinqExpression renvoyée en bool, mais je ne sais pas comment faire.

Pour résumer! Tout d’abord, il est possible de créer nos propres méthodes extensiond dans Linq to Entities qui exécutent le code dans SqlServer? si c’est possible comment je dois le faire?

Merci de votre aide.

Non, vous ne pouvez pas apprendre à EF à traiter vos méthodes d’extension personnalisées, même si votre code génère des expressions utilisables par EF.

Non plus:

  • utiliser les méthodes SqlFunctions directement dans votre expression EF Where
  • utilisez un ExpressionVisitor pour combiner plusieurs expressions en une expression composite ( OrElse / AndAlso ) (notez que cela ne vous aidera pas à obtenir le code que vous souhaitez, mais vous permettra d’utiliser vos deux méthodes et d’effectuer un || – elles auront l’air complexe, cependant)

Le premier est plus simple et plus clair.

Répondu ici: https://stackoverflow.com/a/10726256/84206

Son code: http://pastebin.com/4fMjaCMV

Vous permet de baliser une méthode d’extension avec [Expandable] et tant que l’expression qu’elle retourne fonctionne avec linq2entities, elle remplacera votre appel de fonction par l’expression interne. Notez que les lambdas en ligne donnent des erreurs, je devais donc les déclarer en tant que variables locales ou variables statiques telles que la variable IsCurrent :

 static Expression> IsCurrent = (p) => p.Starts <= DateTime.Now; [ExpandableMethod] public static IQueryable AsOf(this IQueryable source) { return source.Where(IsCurrent); }