2010-09-15 2 views
1

Je vois que Session.Find (requête chaîne, objet [] valeurs, types IType []) est obsolète, et la suggestion est d'utiliser CreateQuery(). SetParameterList(). List() à la place.NHibernate: Maintenant que Session.Find() est obsolète, comment puis-je le remplacer?

Donc, si je l'ai déjà un code qui ressemble à ceci:

var query = "from TABLE t where t.COL1 = ? and t.COL2 = ?"; 
var vals = new[] { qc1, qc2 }; 
var types = new[] { ScalarType.String, ScalarType.String }; 

Session.Find(query, vals, types); 

Qu'est-ce que je passe à l'argument du nom de SetParameterList?

Répondre

0

Je pense que je dois faire:

var q = Session.CreateQuery(query); 
for (int i = 0; i < vals.Length; i++) 
{ 
    q.SetParameter(i, vals[i], types[i]); 
} 
+0

Utilisez .SetParameterList ("cols", vals). – rebelliard

+0

Ne spécifie pas les types – lesscode

1

Qu'est-ce que vous cherchez est probablement quelque chose comme ceci:

session.CreateQuery("from Entity t where t.COL1 = :col1 and t.COL2 = :col2") 
    .SetString("col1", qc1) 
    .SetString("col1", qc2) 
    .List<Entity>(); 

.SetParameterList(...) prend un ICollection comme argument, et peut être utilisé par exemple avec la in clause:

session.CreateQuery("from Entity t where t.COL1 in (:cols)") 
    .SetParameterList("cols", new [] { "someValue", "anotherValue", "etc"}) 
    .List<Entity>(); 
+0

SetString est utile si je sais que l'argument est une chaîne, mais j'ai des milliers de ces requêtes, dont la plupart sont généré, certains via la réflexion, avec les tableaux de valeur et de type. Les requêtes ne nomment pas les espaces réservés aux paramètres - ils spécifient simplement '?'. – lesscode

Questions connexes