在nhibernate c#

时间:2018-01-30 18:23:34

标签: c# asp.net-mvc nhibernate

我的查询包括知道NumCarroIdTotalGastoVlrUnit,在Sql中我能够做到这一点但是当我在HQL中玩时,在SUM旁边应用GROUP BY来制作一个ToList,向我显示已经添加的列表,但是有很多错误:

我尝试了一些例子,但都没有用,主要是我得到了NullReference错误,所以我不知道如何在项目中实现GroupBy

  

string hql =“select a.NumCarro.Id,sum(a.TotalGasto)gastos from Abastecimento a WHERE a.DtAbastecido Between:dataInicial AND:dataFinal GROUP BY a.NumCarro.Id”;

HQL代码:

public IList<Abastecimento> Resumo(DateTime dataInicio, DateTime dataFinal)
{
    string hql = "SELECT NumCarroId, DtAbastecido FROM Abastecimento a WHERE a.DtAbastecido Between :dataInicial AND :dataFinal GROUP BY a.NumCarroId";
    IQuery query = session.CreateQuery(hql)
    .SetParameter("dataInicial", dataInicio)
    .SetParameter("dataFinal", dataFinal);
    return query.List<Abastecimento>();
}

我的表Abastecimento:

CREATE TABLE [dbo].[Abastecimento] (
[Id]            INT             IDENTITY (1, 1) NOT NULL,
[DtAbastecido]  DATETIME        NULL,
[Litro]         INT             NULL,
[VlrUnit]       DECIMAL (18, 2) NULL,
[TotalGasto]    DECIMAL (18, 2) NULL,
[AutorId]       INT             NULL,
[NumCarroId]    INT             NULL,
[Km]            INT             NULL,
[NomeProdutoId] INT             NULL,
[Km_Andado]     INT             NULL,
PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK84286500787E6DCB] FOREIGN KEY ([AutorId]) REFERENCES [dbo].[Usuario] ([Id]),
CONSTRAINT [FK842865002F58EAD8] FOREIGN KEY ([NumCarroId]) REFERENCES [dbo].[Veiculo] ([Id]),
CONSTRAINT [FK8428650023D2F9D9] FOREIGN KEY ([NomeProdutoId]) REFERENCES [dbo].[Compra] ([Id])

);

我的AbastecimentoController:

public ActionResult AbastecimentoResumo(DateTime dataInicio, DateTime dataFinal, int? pagina, Boolean? gerarPDF, AbastecimentoModel viewModel)
    {

        ViewBag.dataInicio = dataInicio;
        ViewBag.dataFinal = dataFinal;

        if (gerarPDF != true)
        {
            //Definindo a paginação
            int paginaQdteRegistros = 30;
            int paginaNumeroNavegacao = (pagina ?? 1);
            return View(abastecimento.ToPagedList(paginaNumeroNavegacao, paginaQdteRegistros));
        }
        else
        {
            int paginaNumero = 1;
            var pdf = new ViewAsPdf
            {

                ViewName = "TesteRelatorio",
                PageSize = Size.A4,
                IsGrayScale = true,
                Model = abastecimento.ToPagedList(paginaNumero, abastecimento.Count),
                PageMargins = new Margins { Bottom = 5, Left = 5, Right = 5, Top = 5 },

            };
            return pdf;
        }
    }

Abastecimento模特:

public class Abastecimento
{
    public virtual int Id { get; set;}
    [Required]
    public virtual int Litro { get; set; }
    public virtual DateTime? DtAbastecido { get; set; }
    public virtual decimal VlrUnit { get; set; }
    public virtual int Km { get; set; }
    public virtual decimal TotalGasto { get; set; }
    public virtual int Km_Andado { get; set; }
    public virtual Usuario Autor { get; set; }
    public virtual Compra NomeProduto { get; set; }
    public virtual Veiculo NumCarro { get; set; }
}

我试试这个例子:

 public ActionResult AbastecimentoResumo(DateTime dataInicio, DateTime dataFinal, int? pagina, Boolean? gerarPDF, AbastecimentoModel viewModel)
    {

        var data = ckm.Resumo(dataInicio, dataFinal).ToList();
        IList<Abastecimento> abastecimento = data.OrderBy(a => a.NumCarro.NCarro).ToList();

        var results = data.GroupBy(p => p.Id, p => p.NumCarro.NCarro).ToList();


}

并将此错误归还给我:

  

System.InvalidOperationException:传入字典的模型项的类型为'System.Collections.Generic.List 1[System.Linq.IGrouping 2 [System.Int32,System.Int32]]',但此字典需要模型项类型为'System.Collections.Generic.IList`1 [BlogWeb.Models.Abastecimento]'。

1 个答案:

答案 0 :(得分:0)

您可以使用LINQ而不是HQL吗?然后你可以使用类似的东西:

var results = 
    session
        .Query<Abastecimento>()
        .Where(a => a.DtAbastecido <= dataFinal && a.DtAbastecido >= dataInicio)
        .GroupBy(a => a.NumCarro.Id)
        .Select(g => 
            new 
            {
                NumCarroId = g.Key, 
                Litri = g.Sum(a => a.Litro)
            })
        .ToList();

这会投射到一个可能没用的匿名类型,但您可以使用其他数据结构来适应。

HQL似乎有点不合时宜,恕我直言。