请帮我将此SQL查询转换为Linq
SELECT convert(varchar, data_acquisto, 101) as data , SUM(quantita)
FROM Acquisto
WHERE data_acquisto >= DATEADD(month,-1,GETDATE())
GROUP BY convert(varchar, data_acquisto, 101)
这是我尝试过的:
var a = from acq in ctx.Acquisto
where acq.data_acquisto >= data
group acq.data_acquisto.ToString("dd/MM/yyyy")
by new { acq.data_acquisto, acq.quantita } into x
select new ListaGrafico()
{
data = x.Key.data_acquisto.ToString("dd/MM/yyyy"),
qta = Convert.ToInt32(x.Key.quantita)
};
这是我得到的错误:
LINQ to Entities无法识别方法'System.String ToString(System.String)'
答案 0 :(得分:1)
分组看起来不正确 - Sql仅按DateTime
列的日期部分进行分组。 Linq IGrouping
将包含按每个分组Key
分组的所有值,因此不需要匿名分组类。
Convert()
很难从Linq转换为Sql,因此在应用谓词并在Linq中完成转换为对象后,我已将数据实现到内存中。
我担心我已经使用了Lambda语法:
var result = ctx.Acquisto
.Where(acq => acq.data_acquisto >= DateTime.Now.AddMonths(-1))
.ToList()
.GroupBy(acq => acq.data_acquisto.Date)
.Select(x => new ListaGrafico
{
data = x.Key.Date.ToString("dd/MM/yyyy"),
qta = x.Sum(acq => acq.quantita)
});
此外,如果可能,我建议您将Date
保留在DateTime
结构中,而不是string
- 这意味着更改data
ListaGrafico
属性1}}从string
到DateTime
,然后您可以在最终.ToString("dd/MM/yyyy")
投影中省略Select
。