2015-02-19 3 views

ответ

1

Предполагая, что тип вашей колонки CreatedOn является DateTime, вы можете сделать хорошее использование DbFunctions.TruncateTime для этой ситуации:

ICollection<GroupedRow> result = context.TableName.GroupBy(t => DbFunctions.TruncateTime(t.CreatedOn)) 
      .Select(g => new GroupedRow() 
      { 
       Sum = g.Sum(t => t.Amount), 
       DateCreatedOn = g.Key 
      }).OrderBy(c => c.DateCreatedOn).ToList(); 

где GroupedRow:

class GroupedRow 
{ 
    public int Sum { get; set; } 
    public DateTime? DateCreatedOn { get; set; } 
} 

Хотя запрос linq к объектам выглядит чистым, ge nerated SQL для Sql Server 2014 будет выглядеть следующим образом:

SELECT 
[Project1].[C3] AS [C1], 
[Project1].[C2] AS [C2], 
[Project1].[C1] AS [C3] 
FROM (SELECT 
    [GroupBy1].[K1] AS [C1], 
    [GroupBy1].[A1] AS [C2], 
    1 AS [C3] 
    FROM (SELECT 
     [Extent1].[K1] AS [K1], 
     SUM([Extent1].[A1]) AS [A1] 
     FROM (SELECT 
      convert (datetime2, convert(varchar(255), [Extent1].[CreatedOn], 102) , 102) AS [K1], 
      [Extent1].[Amount] AS [A1] 
      FROM [dbo].[TableName] AS [Extent1] 
     ) AS [Extent1] 
     GROUP BY [K1] 
    ) AS [GroupBy1] 
) AS [Project1] 
ORDER BY [Project1].[C1] ASC 

102 стиль представляет собой формат "YYYY.MM.DD" согласно CAST and CONVERT (Transact-SQL) документации.

По крайней мере, вы можете отформатировать дату так, как вы хотите, в своем пользовательском интерфейсе, потому что в итоге у вас есть объект DateTime, но в вашем случае, возможно, вы захотите использовать Date.ToString("yyyy-MM-dd").

0

Это может быть сделано с помощью LINQ:

var results = TableName.GroupBy(x => x.CreatedOn).OrderBy(x=>x.CreatedOn).ToList(); 
Смежные вопросы