Первая проблема:
where (a.Date_Assigned.Value.Month == DateTime.Now.AddMonths(-i).Month &&
a.Date_Assigned.Value.Year == DateTime.Now.AddMonths(-i).Month)
Не должно ли последнее выражение заканчиваться на .Year, а не .Month? Конечно, вы редко получаете год со значением 1-12 ...
Я бы извлек идею о "текущем месяце", поскольку вы часто его используете. Обратите внимание, что вы также принимаете текущее время несколько раз, что может дать странные результаты, если оно работает в полночь в конце месяца ...
public Dictionary<string, decimal> getRecentPlacementHistory()
{
var placementHistoryByMonth = new Dictionary<string, decimal>();
using (DemoLinqDataContext db = new DemoLinqDataContext())
{
DateTime now = DateTime.Now;
for (int i = 0; i < 6; i++)
{
DateTime selectedDate = now.AddMonths(-i);
Decimal monthTotal =
(from a in db.Accounts
where (a.Date_Assigned.Value.Month == selectedDate.Month &&
a.Date_Assigned.Value.Year == selectedDate.Year)
select a.Amount_Assigned).Sum();
placementHistoryByMonth.Add(selectedDate.ToString("MMM"),
monthTotal);
}
return placementHistoryByMonth;
}
}
Я понимаю, что это, вероятно, петля, от которой вы пытались избавиться. Вы можете попытаться определить верхнюю и нижнюю границы дат для всего лота, а затем сгруппировать по году / месяцу a.Date_Assigned
в пределах соответствующих границ. Хотя, честно говоря, это не будет намного красивее. Имейте в виду, это был бы только один запрос к базе данных, если бы вы могли выполнить его.