2016-10-07 2 views
3

NHibernate에 대한 연구를 시작했는데 해결할 수없는 문제가 있습니다. 누군가 나를 도울 수 있는지 궁금합니다.NHibernate GroupBy and 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

나는 결과 매핑

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; } 
} 

에 대한 몇 가지 DTO를 소개하는 것입니다 그리고 우리는 단지이 짐작되고, 그것은 할 수 가입

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>(); 

가입 (예외 메시지를 피하기 위해) 추가해야 엔티티/속성 이름이 다를 수 있지만 본질은 명확해야합니다. 우리는 JOIN을 할 필요가 있습니다. DTO를 사용하면 결과를 알려진 유형의 목록으로 쉽게 변환 할 수 있습니다.

+0

감사의 말 ... 당신의 솔루션은 완벽하게 작동했습니다. – Rick

+0

NHaucnate를 즐기십시오. –