如何仅在日期时间的日期部分使用GROUP BY将SQL查询转换为Linq?

时间:2015-05-09 12:45:48

标签: sql sql-server linq

请帮我将此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)'

1 个答案:

答案 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}}从stringDateTime,然后您可以在最终.ToString("dd/MM/yyyy")投影中省略Select