【问题标题】:NHibernate GroupBy and SumNHibernate GroupBy 和 Sum
【发布时间】:2016-10-07 01:28:59
【问题描述】:

我正在开始研究 NHibernate,但有一个我无法解决的问题,不知道是否有人可以帮助我。

映射“正常”工作,但是当我尝试进行分组和求和时,应用程序返回以下错误:

“无法解析属性: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>();

有人遇到过这个问题吗?

【问题讨论】:

    标签: c# nhibernate group-by sum hql


    【解决方案1】:

    我会为结果映射引入一些 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>();
    

    JOIN是猜测的,它可能是不同的实体/属性名称,但本质应该是清楚的。我们需要做那个JOIN。使用 DTO,我们可以轻松地将结果转换为已知类型的列表

    【讨论】:

    • 很高兴看到 ;) 享受 NHibernate,先生
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2019-09-29
    • 2023-03-30
    相关资源
    最近更新 更多