nhibernate queryover LIKE avec des arbres d’expression

Je cherche à append une méthode à ma classe de référentiel de base qui me permette d’utiliser des expressions LIKE mais je ne sais pas trop comment procéder. Je veux créer une méthode générique qui examine l’arborescence d’expression transmise et recherche les caractères génériques dans les valeurs de chaîne transmises. Elle générerait ensuite l’instruction QueryOver conséquence.

J’ai actuellement les éléments suivants:

 public IList FindAll(Expression<Func> criteria, char wildCard) { return SessionFactory.GetCurrentSession() .QueryOver() .Where(criteria) .List(); } 

De toute évidence, le plus dur rest à venir. Je dois parcourir l’arborescence des expressions et construire la requête à l’aide de QueryOver manière dynamic. Vous cherchez des indications sur la façon de procéder. Ou suis-je en train de perdre mon temps ici et devrais-je simplement créer des méthodes individuelles dans mes référentiels qui gèrent les requêtes LIKE ?

Critères supplémentaires

Idéalement, j’aimerais faire la différence entre les éléments suivants:

  • chercher*
  • *chercher
  • *chercher*

La requête générée serait donc:

  • champ LIKE ‘search%’
  • champ LIKE ‘% search’
  • champ LIKE ‘% search%’

Il existe deux façons d’écrire une expression Like dans QueryOver.

Si vous le faites en dehors de la clause Where:

 .Where(Ressortingctions.Like(Projections.Property(*projected property*), *ssortingng value*, MatchMode.Anywhere)) 

Cependant, c’est un peu long à écrire.

Vous pouvez donc utiliser WhereRessortingctionOn:

 .WhereRessortingctionOn(*projected property*).IsLike(*ssortingng value*, MatchMode.Anywhere) 

Cela signifie que vous devez transmettre deux parameters, tels que:

 FindAll(x => x.FirstName, "bob"); 

Vous pourrez peut-être utiliser .Contains, .StartsWith, .EndsWith, mais je ne suis pas sûr.

 FindAll(x => x.FirstName.Contains("bob")); FindAll(x => x.FirstName.StartsWith("bob")); FindAll(x => x.FirstName.EndsWith("bob")); 

Je ne pense pas que ceux-ci fonctionnent dans NHibernate.

J’espère que cela pourra aider.

Je ne comprends pas vraiment ce que tu veux faire. Voulez-vous une requête telle que

 session.QueryOver().Where(x => x.property == "*subssortingng*").List(); 

générer une requête LIKE de propriété “% subssortingng%” ? Dans la plupart des fournisseurs Linq, la méthode Ssortingng.Contains est transformée en une requête “LIKE”. Vous n’avez donc pas besoin de rechercher de caractères génériques dans l’arborescence des expressions, mais uniquement pour la méthode Ssortingng.Contains.
Dans ce dernier cas, vous devrez parsingr l’arbre des expressions à la recherche d’une méthode Ssortingng.Contains (). Cela pourrait être très gênant (http://msdn.microsoft.com/en-us/library/bb397951.aspx). De plus, je ne vois pas dans votre méthode quelle propriété doit être “comparée” à l’opérateur LIKE.

Quoi qu’il en soit, je pense qu’il serait plus facile de passer un ICriterion à votre .Where (), tel que

 .Where(new NHibernate.Criterion.LikeExpression("property", "%value%")) 

et ajoutez vos autres conditions avec .And () juste après. L’inconvénient est de perdre des requêtes fortement typées.

Après avoir longuement cherché une solution au problème de la traduction des expressions de la forme

 session.QueryOver().Where(x => x.SsortingngAttrbute.StartsWith("ajoofa")) 

en SQL de la forme

 SELECT * FROM {table} WHERE {ssortingng_atsortingbute} LIKE 'ajoofa%' 

Je suis venu avec la solution suivante: Yu doit enregistrer des appels de méthodes personnalisées pour les fonctions de chaîne standard .Contains (), .StartsWith, .EndsWith (). Dieu sait pourquoi ces fonctions ne sont pas enregistrées par défaut dans NHibernate. Le code suivant devrait vous aider.

 /// Perform the registration of custom methods ///  public static void Register() { if (!_registered) { _registered = true; Ssortingng str = null; ExpressionProcessor.RegisterCustomMethodCall(() => str.StartsWith(null), ProcessStartsWith); ExpressionProcessor.RegisterCustomMethodCall(() => str.EndsWith(null), ProcessEndsWith); ExpressionProcessor.RegisterCustomMethodCall(() => str.Contains(null), ProcessContains); } } static ICriterion ProcessStartsWith(MethodCallExpression methodCallExpression) { ExpressionProcessor.ProjectionInfo projection = ExpressionProcessor.FindMemberProjection(methodCallExpression.Object); object value = ExpressionProcessor.FindValue(methodCallExpression.Arguments[0]) + "%"; return projection.CreateCriterion(Ressortingctions.Like, Ressortingctions.Like, value); } static ICriterion ProcessEndsWith(MethodCallExpression methodCallExpression) { ExpressionProcessor.ProjectionInfo projection = ExpressionProcessor.FindMemberProjection(methodCallExpression.Object); object value = "%" + ExpressionProcessor.FindValue(methodCallExpression.Arguments[0]); return projection.CreateCriterion(Ressortingctions.Like, Ressortingctions.Like, value); } static ICriterion ProcessContains(MethodCallExpression methodCallExpression) { ExpressionProcessor.ProjectionInfo projection = ExpressionProcessor.FindMemberProjection(methodCallExpression.Object); object value = "%" + ExpressionProcessor.FindValue(methodCallExpression.Arguments[0]) + "%"; return projection.CreateCriterion(Ressortingctions.Like, Ressortingctions.Like, value); }