2015-05-09 50 views
2

请帮我这个SQL查询转换为LINQ的如何将SQL查询转换为仅使用日期时间日期部分的GROUP BY的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到实体不识别方法'System.String ToString(System.String)'

+0

VAR一个=从ACQ在ctx.Acquisto \t \t其中acq.data_acquisto> = DateTime.Now.AddMonths(-1) 组通过新的{acq.data_acquisto.ToString ACQ( “DD/MM/YYYY”) ,acq.quantita}改为x 选择新的ListaGrafico {data = x.Key,qta = x.Key..quantita}为x –

回答

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) 
    }); 

另外,如果可能的话,我会建议保留DateDateTime结构优先于string - 这将意味着改变dataListaGrafico的财产从stringDateTime,然后您可以在最后的Select预测中省略.ToString("dd/MM/yyyy")