2013-04-12 5 views
3

Я хотел бы знать, как я мог бы группировать некоторые данные по месяцам и суммировать поле. Например, у меня есть список MyObjects(DateTimeField, AmountField). Я хочу сгруппировать по DateTimeField, но не всю дату, просто по месяцам, а затем суммируйте AmountField на каждый месяц.Linq Группировка по дате (месяц)

Не знаю, почему objectgrouped не имеет значения?

IEnumerable<MyObject> objectList= GetMyObject(); 

    var ObjectGrouped = objectList.GroupBy(l => l.ObjectDate.GetValueOrDefault().Month) 
          .Select(lg => 
           new 
           { 
            CurrentMonth = lg.Key, 
            Total = lg.Sum(w => w.ObjectAmount) 
           }); 

ObjectDate  ObjectAmount 

1/1/2013    3.3 
3/1/2013    6.9 
13/2/2013   5 
3/4/2013    3.6 
13/4/2013   15.2 
+1

Очень похоже: http://stackoverflow.com/questions/11574474/linq-get-sum-of-data-group-by-date –

ответ

2

Попробуйте это:

List<DateTime> list = new List<DateTime>(); 
var grouppedResult = list.GroupBy(x => x.Month); 
+0

I у меня нет поля Месяц, у меня просто тип поля DateTime, но я хочу только группировать по месяцам, а затем суммировать сумму каждого месяца. – user2112420

+0

класс MyModel {public DateTime Time {get; задавать; }} Список список ... list.GroupBy (x => x.Time.Month); –

+0

Я не знаю, почему я не могу это сделать, кстати, DateTime является Nullable , из-за этого? – user2112420

1
var groups = list.GroupBy(l => l.DateTimeField.Year * 12 + l.DateTimeField.Month) 
       .Select(g => new { 
           Month=g.First().DateTimeField, 
           Sum=g.Select(a=>a.AmountField).Sum() 
          }) 
       .ToList(); 
+0

Я не знаю, почему я ничего не получаю от группы, это значение null, а мой список имеет значения ... – user2112420

4

Я предполагаю, что на "месяц" вы имеете в виду "месяц и год":

Чтобы игнорировать нулевые значения:

var query = myList.Where(i => i.DateTimeField.HasValue) 
        .GroupBy(i => i.DateTimeField.Value.Month) 
        .Select(g => new { 
          Month=g.Key, 
          Total=g.Sum(i=>i.AmountField) 
         }); 

положить null val ЕЭС в отдельном ведре ("0" месяц):

var query = myList.GroupBy(i => i.DateTimeField.HasValue ? i.DateTimeField.Value.Month : 0) 
        .Select(g => new { 
          Month=g.Key, 
          Total=g.Sum(i=>i.AmountField) 
         }); 
+0

Нет, только месяц, потому что прежде чем я получу все данные за текущий год. Но я не могу сделать DateTime.Month, я думаю, это потому, что это Nullable , что я могу сделать? Спасибо – user2112420

+0

Как вы хотите обрабатывать нулевые значения? Они ходят в своем собственном ковше или игнорируются? –

+0

Это всего лишь модель и база данных, но она всегда не является нулевой в БД. – user2112420

Смежные вопросы