Linq в группу сущностей по дате

Провел много исследований, но с этим все еще сложно. Рассмотрим базу данных, в которой есть таблица транзакций CreatedOn, Amount, Type. Мне нужно иметь возможность выполнять запрос сущности, чтобы получать транзакции определенного типа, сгруппированные вместе по разной степени детализации (месяц / день и т. Д.).

Итак, представьте себе стол с:

2011/1/22   $300   Deposit
2011/2/18   $340   Deposit
2011/3/6   $200    Other
2011/3/6   $100    Deposit
2011/3/7   $50     Deposit

У меня может быть запрос, который извлечет все депозиты, сгруппированные по месяцам, чтобы получить:

2011-1 $300 1deposit
2011-2 $340 1deposit
2011-3 $150 2deposits

Как мне затем адаптировать этот запрос, чтобы он был по дням, а не по месяцам?

Вот мой текущий блок кода, но я получаю внутреннее исключение linq

Не могу сгруппироваться на A1

var result = context.TransactionEntities.Where(d => d.Type == "Deposit")                                     
                    .GroupBy(g => new { g.CreatedOn.Year, g.CreatedOn.Month })
                    .Select(g => new
                           {
                                 DateKey = g.Key,
                                 TotalDepositAmount = g.Sum(d => d.Amount),
                                 DepositCount = g.Count()
                            }).ToList();

Примечание. В настоящее время я использую коннектор MySql и читал, возможно, это ошибка?


person Luke Belbina    schedule 25.03.2011    source источник
comment
Я пытаюсь достичь точно такой же функциональности в LINQ to EF, но пока безуспешно, у вас это заработало?   -  person Anand    schedule 11.08.2012


Ответы (3)


Func<DateTime, object> groupByClause;
if (groupByDay) groupByClause = date => date.Date;
else if (groupByMonth) groupByClause = date => new { date.Year, date.Month};
else throw new NotSupportedException("Some option should be chosen");

var result = data.Where(d => d.Type == "Deposit")
                 .GroupBy(groupByClause)
                 .Select(g => new { DateKey = g.Key,
                                    TotalDepositAmount = g.Sum(d => d.Amount),
                                    DepositCount = g.Count(),
                 });

Конечно, следует проверить, примет ли это linq-2-entity.

person Snowbear    schedule 25.03.2011
comment
эй, это выглядит очень солидно. Я попробовал и получил внутреннее исключение «Не могу сгруппироваться на A1». Мой запрос выглядит так: var result = context.TransactionEntities.Where (d = ›d.Type == Deposit) .GroupBy (g =› new {g.CreatedOn.Year, g.CreatedOn.Month}) .Select (g = ›Новый {DateKey = g.Key, TotalDepositAmount = g.Sum (d =› d.Amount), DepositCount = g.Count ()}). ToList (); - person Luke Belbina; 26.03.2011

Проверьте код, упомянутый в моем вопросе: Группировать по неделям в LINQ to Entities. Он показывает, как вы можете сгруппировать данные по дням и месяцам. Дайте мне знать, если у вас есть еще вопросы.

person StriplingWarrior    schedule 25.03.2011

Вероятно, это ошибка коннектора MySQL. Моим решением было разместить .ToList() непосредственно перед .GroupBy().

person HiveHicks    schedule 16.02.2013
comment
Да, проблема в том, что ToList выполняет SQL-запрос, а группа by будет локальной, поэтому она может получить тонну данных. - person Luke Belbina; 20.02.2013
comment
@nextgenneo Да, но это лучше, чем ничего :) - person HiveHicks; 23.02.2013