2010-03-30 6 views
20

Est-il possible d'obtenir Nhibernate linq pour générer une requête avec une clause "In"? par exemple. - Where AnID in (x,y,z)?Nhibernate Linq In Clause

Répondre

28

Je ne connais pas l'état de nHibernate en ce qui concerne la génération de toutes les requêtes LINQ potentielles, mais vous devriez pouvoir utiliser .Contains() pour générer un IN.

var list = new int[] { x, y, x }; 
var q = db.Entities.Where(e => list.Contains(e.AnID)); 
+0

Eh oui, travaille avec NHibernate 3.1.0 GA –

3

D'accord, cela fonctionne. J'ai trouvé le SQL généré pour « pas » être étrange que (comme de 3.3.0 GA)

... 
from 
    mytable t0_ 
where 
    case 
    when t0_.testValue in (
       @p0 , @p1 , @p2 
     ) then 1 
      else 0 
    [email protected] 
@p0 = 9 [Type: Int32 (0)], 
@p1 = 99 [Type: Int32 (0)], 
@p2 = 109 [Type: Int32 (0)], 
@p3 = False [Type: Boolean (0)], 
... 

semble un peu étrange de « cas » quand « non » aurait été plus clair (pas Je prévois de lire chaque ligne, mais dans une trace/profil peut-être).

(... plus tard ce jour-là ...)

Je réalise que le choix ci-dessus 'étrange' de SQL est que lorsque je

.Where(e => list.Contains(e.AnID) == false) 

Si je

.Where(e => !list.Contains(e.AnID)) 

Le SQL généré est beaucoup plus propre (en utilisant « non »)

0

NHibernate a une option Isín partie de RestrictionEx tensions

x => x.Name.IsIn (nouveau [] { "a", "b"})