2015-05-09 48 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")