Projections in NHibernate

supposons qu'une entité il y a des attributs id, pseudo, nom, âge, adresse. Maintenant je veux juste id et username et j'utilise ce code pour ça.

Projections de permettre le retour de quelque chose d'autre qu'une liste d'entités à partir d'une requête.

var proj = Projections.ProjectionList()
    .Add(Projections.Property("Id"), "Id")
    .Add(Projections.Property("Username"), "Username");

var list2 = DetachedCriteria.For<User>()
    .Add(Expression.Eq("Username", "lachlan"))
    .GetExecutableCriteria( sessionFactory.GetCurrentSession())
    .SetProjection( proj )
    .List();

Comment vais-je récupérer les valeurs. Dans quel objet ces valeurs seront prises.

6
demandé sur Kent Boogaart 2010-02-05 16:04:03

1 réponses

sauf si un transformateur de résultat est utilisé, une projection résultera en une liste d'objets anonymes avec les valeurs projetées. Cela serait suffisant pour la collecte de données.

pour d'autres utilisations, vous voulez définir un transformateur de résultat qui créera des objets d'un type connu. Le AliasToBeanTransformer créera un objet du type spécifié pour chaque ligne, et définira ses propriétés aux valeurs de la ligne.

Si vous connaissez le type de résultats, vous pouvez utiliser le méthode générique List<T>() .

var proj = Projections.ProjectionList()
    .Add(Projections.Property("Id"), "Id")
    .Add(Projections.Property("Username"), "Username");

var list2 = DetachedCriteria.For<User>()
    .Add(Expression.Eq("Username", "lachlan"))
    .GetExecutableCriteria( sessionFactory.GetCurrentSession())
    .SetProjection( proj )
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();
Les transformateurs de résultat

peuvent également être utilisés pour les requêtes SQL et HQL.

list2 = Session.CreateSQLQuery("select Id, Username from user_table")
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();

list2 = Session.CreateQuery("select Id, Username from User")
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();

dans ces exemples, la classe de résultat n'a pas besoin d'être une classe mappée, et doit avoir les propriétés sélectionnées.

partial class Result
{
    public int Id { get; set; }
    public string Username { get; set; }
}
27
répondu Lachlan Roche 2010-02-05 13:43:22