我的查询包括知道NumCarroId
,TotalGasto
和VlrUnit
,在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]'。
答案 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似乎有点不合时宜,恕我直言。