2010-04-14 9 views
0

Est-il possible de choisir quelles colonnes je veux retourner de Session.CreateCriteria()?Requête NHibernate CreateCriteria

EGZ .:

var x = session.CreateCriteria(); 
    x.CreateAlias("EmployeePosition", "employeePosition"); 
    x.Add(Restrictions.Eq("employeePosition.Name", "Developer")); 

et est-il un moyen d'ajouter quelque chose comme "select LastName" pour éviter de télécharger toute la ligne.

Répondre

3

créez une classe qui n'a que les propriétés dont vous avez besoin, souvent c'est une classe récapitulative comme {Id, Label} et vous la réutiliserez partout où vous avez besoin d'un type simple, dans une liste par exemple. Utilisez ProjectionList pour définir les colonnes à renvoyer. Ensuite, utilisez Transformers.AliasToBean pour transformer le résultat en votre type simple.

ProjectionList projectionList = Projections.ProjectionList(); 
projectionList.Add(Projections.Property("EmployeeID"), "Id"); 
projectionList.Add(Projections.Property("EmployeePosition"), "Label"); 
var x = DetachedCriteria.For(Employee); 
x.SetProjection(projectionList); 
x.SetResultTransformer(Transformers.AliasToBean(SimpleType))); 
return x.GetExecutableCriteria(UnitOfWork.CurrentSession).List<SimpleType>(); 
1

Je suggère d'essayer Linq à NHibernate. Il vous permettra de faire ce que vous demandez d'une manière très naturelle.

+1

C'est le problème, il y a tellement de bugs que ça ne sert à rien dans cette situation particulière. J'espère qu'ils vont l'améliorer dans NH 3.0 – Jacob

+0

Hmmm. Nous l'utilisions dans un assez gros projet sans aucune difficulté. Probablement ne pas le pousser assez car nous n'avions pas trop de jointures complexes. –

2

Vous pouvez le faire en utilisant les projections:

IList<Object[]> list = session.CreateCriteria(typeof(Employee)) 
    .SetProjection(Projections.ProjectionList() 
    .Add(Projections.Property("FirstName")) 
    .Add(Projections.Property("LastName")) 
).List<Object[]>(); 

    foreach(Object[] person in list) 
    { 
    String firstName = person[0]; 
    String lastName = person[1]; 
    } 

Découvrez l'espace de noms NHibernate.Expressions pour d'autres projections ainsi.

0

Pour ajouter à dana's answer, si vous avez une classe à laquelle vous souhaitez la lire, vous pouvez également utiliser Transformers.AliasToBean avec la projection. NHibernate essaiera alors de remplir les propriétés de l'objet avec les valeurs des noms de champs correspondants.