Объединение данных по дате через LINQ - C#
Формулировка задачи:
Помогите разобраться с запросом. Есть следующие 2 класса:
Мне нужно сформировать единый сгруппированный список со следующими полями: Месяц, Год, Summa, SumEntrance, SumAdded
Вот получил 2 списка с полями:
Как можно создать единый список, в котором произойдет объединение по полям Месяц и Год? Заранее спасибо
public partial class Expence { public int Id { get; set; } public System.DateTime ExpDate { get; set; } public string ExpDescription { get; set; } public decimal Summa { get; set; } public int TypeExpenceId { get; set; } public virtual TypeExpence TypeExpences { get; set; } } public partial class Profit { public int Id { get; set; } public System.DateTime ProfDate { get; set; } public string ProfDescription { get; set; } public decimal SumEntrance { get; set; } public decimal SumAdded { get; set; } public int PersonId { get; set; } public virtual Person Persons { get; set; } }
var expences = db.ExpenceSet.AsNoTracking() .Select(x => new { x.ExpDate.Month, x.ExpDate.Year, x.Summa }) .GroupBy(x => new { x.Month, x.Year }) .Select(y => new { y.Key.Month, y.Key.Year, SumExp = y.Sum(k => k.Summa) }); var profits = db.ProfitSet.AsNoTracking() .Select(x => new { x.ProfDate.Month, x.ProfDate.Year, x.SumEntrance, x.SumAdded }) .GroupBy(x => new { x.Month, x.Year }) .Select(y => new { y.Key.Month, y.Key.Year, SumEntProf = y.Sum(k => k.SumEntrance), SumAddProf = y.Sum(k => k.SumAdded) });
я так понял можно все сделать с помощью GroupJoin, вот только он не работает с необобщенными коллекциями, можно это как-то обойти или нужно создавать новые классы?
Решение задачи: «Объединение данных по дате через LINQ»
textual
Листинг программы
var result = from m in (from e in db.Expence from p in db.Profit.Where(x => x.ProfDate.Year == e.ExpDate.Year && x.ProfDate.Month == e.ExpDate.Month).DefaultIfEmpty() select new { e.ExpDate.Month, e.ExpDate.Year, e.Summa, p.SumEntrance, p.SumAdded }) group m by new { m.Month, m.Year } into newGroup let Summa = newGroup.Sum(x => x.Summa) let SumEntrance = newGroup.Sum(x => x.SumEntrance) let SumAdded = newGroup.Sum(x => x.SumAdded) orderby newGroup.Key.Year descending, newGroup.Key.Month ascending select new { newGroup.Key.Month, newGroup.Key.Year, Summa, SumEntrance, SumAdded };
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д