如何在NHibernate中选择十大最畅销的产品?

时间:2016-05-09 19:20:12

标签: c# nhibernate fluent-nhibernate nhibernate-criteria

此解决方案对我不起作用: C#/NHibernate - Get first 10 records ordered by grouped sum

我的情况非常相似,但我不断收到以下错误消息:

Additional information: could not resolve property: Produto_Id of: SistemaVendas.Domain.venda.ProdutoVendido

到目前为止我的代码:

ICriteria criteria = unitOfWork.Session
            .CreateCriteria<ProdutoVendido>("ProdutoVendido")
            .SetMaxResults(limite)
            .CreateCriteria("Produto_Id")
                .SetProjection(Projections.ProjectionList()
                    .Add(Projections.GroupProperty("Produto_Id"), "ID")
                    .Add(Projections.Sum("ProdutoVendido.Quantidade"), "QuantitySum")
                )
                .AddOrder(Order.Desc("QuantitySum"));

return criteria
            .SetResultTransformer(Transformers.AliasToBean<Produto>())
            .List<Produto>().ToList();

我做错了什么?

P.S。 ProdutoVendido = SoldProduct和 Produto =产品

ProdutoVendido mapping

    public ProdutoVendidoMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();            

        Map(x => x.Quantidade);
        Map(x => x.Desconto);
        Map(x => x.Observacao).Length(ProdutoVendido.MAX_OBSERVACAO_LENGTH);            

        References(x => x.Venda)
            .Cascade.None();
        References(x => x.Produto)
            .Cascade.None();
    }

修改

最终解决方案

我刚创建了这个DTO,正如@RadimKöhler指出的那样

public class ProdutoDto
{
    public ulong Id { get; set; }
    public int QuantidadeTotal { get; set; }
}

我最后的NHibernate查询是

ICriteria criteria = unitOfWork.Session
    .CreateCriteria<ProdutoVendido>("ProdutoVendido")
    .SetMaxResults(limite)            
    .CreateCriteria("Produto", "p")            
        .SetProjection(Projections.ProjectionList()
            .Add(Projections.GroupProperty("p.Id"), "Id")
            .Add(Projections.Sum("ProdutoVendido.Quantidade"), "QuantidadeTotal")                    
        )
        .AddOrder(Order.Desc("QuantidadeTotal"));

var ids = criteria
            .SetResultTransformer(Transformers.AliasToBean<ProdutoDto>())
            .List<ProdutoDto>();

return unitOfWork.Session
    .CreateCriteria<Produto>()                
    .Add(Restrictions.In("Id", ids.Select(x => x.Id).ToArray()))
    .List<Produto>().ToList();

1 个答案:

答案 0 :(得分:0)

要修复NHibernate返回的错误,我们必须查询现有的Object模型。在这种情况下,售出的产品(ProdutoVendido)引用pchtq .Select( pchtq.Status, pchtq.Amount, pchtq.RecordCreateDateTime, utaq.UserName, utaq.FullName) .InnerJoin(utaq).On(pchtq.id== utaq.id) .Where(pchtq.RecordCreateDateTime >= request.StartDate && pchtq.RecordCreateDateTime <= request.EndDate && pchtq.Status.ToUpper() == "PAID" || pchtq.Status.ToUpper() == "AUDIT"); if (pchtc.Load(pchtq)) { //stuff } ,而不是 Produto_Id

Produto

检查类似的工作查询,例如here

EXTEND

我们需要能够投射SUM属性 - 是DTO (不是POCO, just DTO用于此目的)。检查此Q&amp; A灵感Joining two tables with specific columns in nhibernate

可能是这样:

...
Session
  .CreateCriteria<ProdutoVendido>("ProdutoVendido")
  ...
  // this line is about joining reference
  // not the column
  //.CreateCriteria("Produto_Id")
  .CreateCriteria("Produto", "p") // "p" is now alias which we can use

我们可以将其用作投影目标:

public class ProdutoDto
{
    public virtual int ID { get; set; }
    public virtual decimal QuantitySum { get; set; } // the type should match
}