2016-10-07 3 views
3

Я начинаю исследование по NHibernate, и у меня есть проблема, которую я не могу решить, интересно, может ли кто-нибудь помочь мне.NHibernate GroupBy и Sum

отображение работает «правильно», но когда я пытаюсь сделать группировку и сумму, приложение возвращает следующее сообщение об ошибке:

"could not resolve property: Course.Price of: Persistence.POCO.RequestDetail"

var criteria = session.CreateCriteria(typeof(RequestDetail)) 
.SetProjection(
    Projections.ProjectionList() 
    .Add(Projections.RowCount(), "RowCount") 
    .Add(Projections.Sum("Course.Price"), "Price") 
    .Add(Projections.GroupProperty("Request"), "RequestId") 
) 
.AddOrder(Order.Asc("RequestId")) 
.SetResultTransformer(Transformers.AliasToEntityMap) 
.List(); 

Примечание 1: Когда я беру код .Add(Projections.Sum ("Course.Price"), "Price") приложение возвращает результат правильно.

Примечание 2: Единственный способ, которым я мог сделать, выполнить код ниже:

query.Length = 0; 
query.AppendLine("select"); 
query.AppendLine(" s.Id,"); 
query.AppendLine(" s.Identification,"); 
query.AppendLine(" sum(c.Price) as Total"); 
query.AppendLine("from"); 
query.AppendLine(" Student s"); 
query.AppendLine("inner join"); 
query.AppendLine(" Request r on r.StudentId = s.Id"); 
query.AppendLine("inner join "); 
query.AppendLine(" Requestdetail rq on rq.RequestId = r.Id"); 
query.AppendLine("inner join"); 
query.AppendLine(" Course c on c.Id = rq.CourseId"); 
query.AppendLine("Group by"); 
query.AppendLine(" s.Id, s.Identification"); 
query.AppendLine("Order by"); 
query.AppendLine("s.Identification"); 
IQuery criteria = session.CreateSQLQuery(query.ToString()) 
    .SetResultTransformer(Transformers.AliasToBean<Teste>()); 

IList<Teste> teste = criteria.List<Teste>(); 

Кто-нибудь сталкивался с этим проблемы?

ответ

2

Я хотел бы представить некоторые DTO для результата отображения

public class MyDTO 
{ 
    public virtual int RowCount { get; set; } 
    public virtual decimal Price { get; set; } // type depends on SUM result 
    public virtual int RequestId { get; set; } 
} 

И тогда мы просто должны добавить JOIN (чтобы избежать появления сообщения об исключении)

var criteria = session.CreateCriteria(typeof(RequestDetail)) 
    // the Course.Price comes from some collection 
    // we have to JOIN it 
    .CreateAlias("Course", "Course")// the first is property name, the second is alias 
    .SetProjection(
     Projections.ProjectionList() 
     .Add(Projections.RowCount(), "RowCount") 
     .Add(Projections.Sum("Course.Price"), "Price") 
     .Add(Projections.GroupProperty("RequestId"), "RequestId") 
    ) 
    .AddOrder(Order.Asc("RequestId")) 
    .SetResultTransformer(Transformers.AliasToBean<MyDTO>()) 
    ; 
var list = criteria.List<MyDTO>(); 

Соединить угадывается, это может быть другим именем субъекта/свойства, но суть должна быть ясной. Мы должны сделать это ПРИСОЕДИНЕНИЕ. С DTO мы затем легко преобразуем результат в список известных типов

+0

Спасибо человеку ... ваше решение отлично работало – Rick

+0

Это замечательно видеть;) Наслаждайтесь NHibernate, сэр –