2009-11-06 5 views
22

Comment puis-je produire cette requête en utilisant NHibernate.Linq?NHibernate.Linq LIKE

WHERE this_.Name LIKE @p0; @p0 = 'test' // Notice NO % wild card 

Notez que ceci n'est pas Linq To Sql ou Entity Framework. C'est NHibernate.

Edit:

Voici la requête désirée à l'aide ICriteria:

criteria.Add(Expression.Like("Name", "test")); 
return criteria.List<Theater>(); 

Répondre

6

Avec NH 4 (et probablement un peu plus tôt), un haut-Like extension de chaîne est disponible dans les espace de noms NHibernate.Linq: Like(this string matchExpression, string sqlLikePattern). (Il est défini sur NHibernate.Linq.SqlMethods classe d'extension.)

using NHibernate.Linq; 
... 
session.Query<Theater>() 
    .Where(t => t.Name.Like("test")); 
17

Je crois que c'est ce que vous cherchez:

var theaters = from theater in Session.Linq<Theater>() 
       where theater.Name.Contains("test") 
       select theater; 

D'après mes tests, il génère une instruction SQL 'LIKE': "... WHERE theater.Name LIKE% test%"

qui est exactement la sortie de l'extrait de critères que vous avez fourni.

+1

l'aide des critères (fournis dans la question), je ne vois pas les% wildcards générés. – mxmissile

+0

Je viens d'exécuter le test unitaire que j'ai avec le code fourni dans ma réponse et il a produit une instruction SQL avec le caractère générique% dans les deux extrémités sur la chaîne serch. Je lance aussi le même test en utilisant les critères Critérium et j'obtiens exactement la même instruction SQL si j'utilise criteria.Add (Expression.Like ("Name", "test", MatchMode.Anywhere)); J'utilise NHibernate 2.1 avec SQL Server 2005. Si vous utilisez la même configuration, vous devriez pouvoir voir les mêmes résultats. – tolism7

+0

Le problème est que je ne veux pas que les jokers utilisent Linq. Mon commentaire ci-dessus répondait à votre réponse "exactement la sortie de l'extrait de critères que vous avez fourni". Désolé si je n'étais pas clair. Je peux réaliser la requête désirée avec ICriteria comme indiqué dans la question, mais ne peux pas sembler l'accomplir en utilisant Linq. – mxmissile

15

J'ai eu le même problème dans mon projet et a trouvé une solution:

session.Linq<Theater>() 
    .Where(x => x.Name.StartsWith("test") && x.Name.EndsWith("test"); 

Cela se traduit dans SQL

SELECT ... WHERE Name LIKE '%test' AND Name LIKE 'test%' 
+4

ajout: '&& x.Nom.Longueur ==" test ".Length'. sinon vous finiriez avec des résultats comme «test bla bla bla test» –

+6

Je peux manquer le point, mais sûrement vous ne faites pas vraiment un «like» mais un «égal» ... .Où (x => x.Name.Equals ("test"); –

+0

Il est en effet comme @ n3rd dit –

22

Bien que cela a été marquée comme résolue, ce qui était correct au moment , puis-je noter également que NHibernate a quelques extensions maintenant pour que vous puissiez effectuer les opérations suivantes:

Session.QueryOver<MyEntity>() 
    .Where(x => x.Property.IsLike("something", MatchMode.Anywhere)) 
    .List(); 

Thi S fera un LIKE '%something%' pour vous.

+1

Ce sont des produits prêts à l'emploi, non construits sur mesure – Kezzer

+0

+1 exactement ce que je cherchais pour, peut être utile de noter pour résoudre le problème exact ci-dessus que vous souhaitez utiliser MatchMode.Exact (no% wildcard) – PJUK

+0

Doit ajouter un 'using NHibernate.Criterion;' lorsque vous n'utilisez pas Resharper.Mais fonctionne très bien! Merci –