1 votes

Projection NHibernate : Comment obtenir un type typé en utilisant l'API Critères avec projection

 List<object[]> products = GetSession().CreateCriteria<Product>()
            .SetProjection(Projections.ProjectionList()
                               .Add(Projections.Property("Id"))
                               .Add(Projections.Property("Name"))
                               .Add(Projections.Property("Price"))
             )
             .List();
public class ProductRow
{
     public int Id { get; set; }
     public string Name { get; set; }
     public double Price { get; set; }
}

Comment puis-je obtenir le résultat sous la forme d'une liste de type List<ProductRow> ?

Je vois qu'il existe une fonction Projection.Cast, mais je ne vois pas de documentation sur la façon de l'utiliser.

3voto

Darin Dimitrov Points 528142

Vous pouvez essayer de mettre un transformateur de résultat :

var result = GetSession()
    .CreateCriteria<Product>()
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.Property("Id"), "Id")
        .Add(Projections.Property("Name"), "Name")
        .Add(Projections.Property("Price"), "Price")
    )
    .SetResultTransformer(Transformers.AliasToBean<ProductRow>())
    .List<ProductRow>();

Notez l'utilisation d'un alias pointant vers le nom d'une propriété d'une ProductRow lors de l'ajout de chaque projection.

-1voto

Ben Points 4

Je n'ai pas réussi à trouver une solution à ce problème spécifique. J'ai posté une question similaire il y a quelques jours (http://stackoverflow.com/questions/3921457/nhibernate-entity-access-through-projection). Le message d'erreur est dû au fait que NHibernate recherche une propriété nommée Category dans votre classe Product. Je suppose qu'il n'y en a pas. La seule solution que j'ai pu trouver jusqu'à présent consiste à utiliser un DTO. Je me suis également penché sur les générateurs dynamiques de DTO et sur le Dynamic LINQ to NHibernate en utilisant des arbres d'expression, des expressions lambda ou un ExpressionSelector. Tout cela semble relativement compliqué. J'aimerais qu'il y ait une solution simple pour définir les entités de manière dynamique, c'est-à-dire par projection.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X