У меня есть две следующие объектные модели:
public class Product
{
public int IdProduct;
public Category IdCategory;
public string Name;
public bool Available;
}
public class Category
{
public int IdCategory;
public string Name;
}
Я хочу список всех категорий, упорядоченных по наиболее часто используемым категориям вверху списка.
Я придумал следующий запрос NHibernate:
Product productAlias = null;
Category categoryAlias = null;
Category categoryAliasOutput = null;
session.QueryOver<Product>(() => productAlias)
.JoinAlias(p => p.Category, () => categoryAlias, JoinType.RightOuterJoin)
.Select(Projections.ProjectionList()
.Add(Projections.Group(() => categoryAlias.IdCategory).WithAlias(() => categoryAliasOutput.IdCategory))
.Add(Projections.Group(() => categoryAlias.Name).WithAlias(() => categoryAliasOutput.Name))
.Add(Projections.Count(() => productAlias.IdCategory.IdCategory)))
.OrderBy(Projections.Count(() => productAlias.IdCategory.IdCategory)).Desc
.ThenBy(Projections.Property(() => categoryAlias.Name)).Asc
.TransformUsing(Transformers.AliasToBean<Category>())
.List<Category>();
Это работает, но я ищу способ упростить код, так как он выглядит некрасиво.
Также это упрощенный пример. В моем случае я имею дело с объектами с гораздо большим количеством свойств, которые все должны быть добавлены в ProjectionList.
Я не могу использовать «Transformers.RootEntity», поскольку корневая сущность имеет тип «Product», а результатом должен быть список типа «Category».