Ceci est un exemple en utilisant la projection:
List results = session.CreateCriteria<BrandTable>()
.SetProjection(Projections.ProjectionList()
.Add(Projections.Id(), "Id")
.Add(Projections.Property("Name"), "Name")
)
.SetResultTransformer(Transformers.AliasToBean<BrandTable>()); // edit - don't forget the result transformer!
.List();
ici un exemple en utilisant QueryOver:
NHibernate QueryOver select entity and aggregates
[modifier] aussi, il y a actuellement un bug lors de la mise en cache icriteria projections. (si vous essayez de mettre en cache la requête, vous obtenez une exception) https://nhibernate.jira.com/browse/NH-1090 [/ modifier]
messages Releted:
NHibernate Criteria: howto exclude certain mapped properties/collections?
Only retrieve specific columns when using Critera queries?
LINQ-NHibernate - Selecting only a few fields (including a Collection) for a complex object
rendre vos requêtes réusiner-safe (pas de « cordes magiques »), vous pouvez mettre en œuvre quelque chose comme ceci:
public static class ObjectExtensions
{
public static string NameOf<T>(this T target, Expression<Func<T, object>> propertyExpression)
{
MemberExpression body = null;
if (propertyExpression.Body is UnaryExpression)
{
var unary = propertyExpression.Body as UnaryExpression;
if (unary.Operand is MemberExpression)
body = unary.Operand as MemberExpression;
}
else if (propertyExpression.Body is MemberExpression)
{
body = propertyExpression.Body as MemberExpression;
}
if (body == null)
throw new ArgumentException("'propertyExpression' should be a member expression");
// Extract the right part (after "=>")
var vmExpression = body.Expression as ConstantExpression;
// Extract the name of the property
return body.Member.Name;
}
}
en utilisant comme ceci:
MyEntity entity = null; // don't need a 'valid' instance.
string propName = entity.NameOf(x => x.SomePropertyName);
Vous commandez et appliquez une projection en mémoire, c'est pourquoi cela ne fonctionne pas (la méthode .List() sélectionne tous les enregistrements – Vasea