Question

Supposons dans une entité, il y a des attributs id, nom d'utilisateur, âge, adresse. Maintenant, je veux juste id et nom d'utilisateur et j'utiliser ce code pour cela.

Les projections permettent au retour de quelque chose d'autre qu'une liste des entités 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 puis-je récupérer les valeurs. Dans quel objet sera la valeur de ces prises.

Était-ce utile?

La solution

A moins est utilisé un transformateur de résultat, une projection se traduira par une liste d'objets anonymes avec les valeurs projetées. Ce serait suffisant pour la liaison de données.

Pour d'autres utilisations, vous souhaitez définir un transformateur de résultat qui va créer des objets d'un type connu. Le AliasToBeanTransformer va créer un objet du type spécifié pour chaque rangée, et définir ses propriétés aux valeurs de ligne.

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

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>();

transformateurs de résultats peuvent également être utilisés sur des 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; }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top