public void LoadMonthCategorySummary()
{
List<monthsummary> MonthSummaryList;
using ( budgetEntities = new BudgetEntities() )
{
var initial = from m in budgetEntities.SpendingSet
join mc in budgetEntities.MthCategorySet on m.MthCategory.MthCategoryId equals mc.MthCategoryId
join c in budgetEntities.CategorySet on mc.Category.CategoryId equals c.CategoryId
where m.DateSpent.Month == DateTime.Now.Month && m.DateSpent.Year == DateTime.Now.Year
select new
{
CategoryName = c.CategoryName,
BudgetAmount = mc.BudgetAmount,
AmountSpent = m.Amount
};
var list = from i in initial
group i by i.CategoryName into g
orderby g.Key ascending
select new
{
CategoryName = g.Key,
AmountSpent = g.Sum( ms => ms.AmountSpent ),
MonthSummary = g.FirstOrDefault()
};
MonthSummaryList = ( from ms in list
select new MonthSummary
{
CategoryName = ms.CategoryName,
AmountSpent = ms.AmountSpent,
BudgetAmount = ms.MonthSummary.BudgetAmount
} ).ToList();
}
gvMonthSummary.DataSource = MonthSummaryList;
gvMonthSummary.DataBind();
}As you can see this is not your simple CRUD functionality with joins across three different tables.
So what approach did I take to resolve this?
Firstly, you need to understand that each data service is dependent on a corresponding repository. For example, the SpendingsDataService is dependent on IRepository<Spending>.
My first approach was to try and expose the datacontext, but it occurred to me that this was actually breaking the repository pattern.
The only other alternative was to introduce a second IRepository<T> object, which meant that I needed to create a second constructor.
The code I ended up with looks something like this...
public IList<MonthSummary> GetMonthCategorySummary( DateTime analysisDate )
{
IList<MonthSummary> mcSummaryList;
using ( sRepo )
{
using ( mcRepo )
{
var initial = from s in sRepo.Query()
join mc in mcRepo.Query() on s.MthCategoryId equals mc.MthCategoryId
where s.DateSpent.Month == analysisDate.Month && m.DateSpent.Year == analysisDate.Year
select new
{
CategoryName = mc.Category.CategoryName,
BudgetAmount = mc.BudgetAmount,
AmountSpent = s.Amount
};
var list = from i in initial
group i by i.CategoryName into g
orderby g.Key ascending
select new
{
CategoryName = g.Key,
AmountSpent = g.Sum( ms => ms.AmountSpent ),
MonthSummary = g.FirstOrDefault()
};
mcSummaryList = ( from ms in list
select new MonthSummary
{
CategoryName = ms.CategoryName,
AmountSpent = ms.AmountSpent,
BudgetAmount = ms.MonthSummary.BudgetAmount
} ).ToList();
}
}
return mcSummaryList;
}
No comments:
Post a Comment