2010-04-14 4 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.

Questions connexes