projection NHibernate: Comment obtenir un type tapé en utilisant l'API Criteria avec projection
-
20-09-2019 - |
Question
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 comme une liste
Je vois qu'il ya une Projection.Cast fonction, mais je ne vois pas de documentation sur la façon de l'utiliser.
La solution
Vous pouvez essayer de définir 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 des alias pointant vers un nom de propriété d'un ProductRow
lors de l'ajout de chaque projection.
Autres conseils
Je n'ai pas été en mesure de 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 becuase NHibernate est à la recherche d'une propriété nommée Catégorie dans votre catégorie de produits. Je suppose qu'il n'y a pas un. Les travaux ony autour J'ai pu trouver jusqu'à présent est d'utiliser un DTO. De plus, en regardant plus profondément dans les générateurs DTO dynamiques et dynamique LINQ to NHibernate en utilisant des arbres d'expression, expressions lambda et un ou ExpressionSelector. Tout cela semble relativement complexe. Je souhaite qu'il y ait une solution simple pour définir des entités dynamiclly, i.e. projection.