Объединение данных по дате через LINQ - C#

Узнай цену своей работы

Формулировка задачи:

Помогите разобраться с запросом. Есть следующие 2 класса:
Листинг программы
  1. public partial class Expence
  2. {
  3. public int Id { get; set; }
  4. public System.DateTime ExpDate { get; set; }
  5. public string ExpDescription { get; set; }
  6. public decimal Summa { get; set; }
  7. public int TypeExpenceId { get; set; }
  8. public virtual TypeExpence TypeExpences { get; set; }
  9. }
  10. public partial class Profit
  11. {
  12. public int Id { get; set; }
  13. public System.DateTime ProfDate { get; set; }
  14. public string ProfDescription { get; set; }
  15. public decimal SumEntrance { get; set; }
  16. public decimal SumAdded { get; set; }
  17. public int PersonId { get; set; }
  18. public virtual Person Persons { get; set; }
  19. }
Мне нужно сформировать единый сгруппированный список со следующими полями: Месяц, Год, Summa, SumEntrance, SumAdded Вот получил 2 списка с полями:
Листинг программы
  1. var expences = db.ExpenceSet.AsNoTracking()
  2. .Select(x => new { x.ExpDate.Month, x.ExpDate.Year, x.Summa })
  3. .GroupBy(x => new { x.Month, x.Year })
  4. .Select(y => new
  5. {
  6. y.Key.Month,
  7. y.Key.Year,
  8. SumExp = y.Sum(k => k.Summa)
  9. });
  10. var profits = db.ProfitSet.AsNoTracking()
  11. .Select(x => new
  12. {
  13. x.ProfDate.Month,
  14. x.ProfDate.Year,
  15. x.SumEntrance,
  16. x.SumAdded
  17. })
  18. .GroupBy(x => new { x.Month, x.Year })
  19. .Select(y => new
  20. {
  21. y.Key.Month,
  22. y.Key.Year,
  23. SumEntProf = y.Sum(k => k.SumEntrance),
  24. SumAddProf = y.Sum(k => k.SumAdded)
  25. });
Как можно создать единый список, в котором произойдет объединение по полям Месяц и Год? Заранее спасибо
я так понял можно все сделать с помощью GroupJoin, вот только он не работает с необобщенными коллекциями, можно это как-то обойти или нужно создавать новые классы?

Решение задачи: «Объединение данных по дате через LINQ»

textual
Листинг программы
  1. var result = from m in (from e in db.Expence
  2.                                      from p in db.Profit.Where(x => x.ProfDate.Year == e.ExpDate.Year && x.ProfDate.Month == e.ExpDate.Month).DefaultIfEmpty()
  3.                                      select new
  4.                                      {
  5.                                          e.ExpDate.Month,
  6.                                          e.ExpDate.Year,
  7.                                          e.Summa,
  8.                                          p.SumEntrance,
  9.                                          p.SumAdded
  10.                                      })
  11.                           group m by new { m.Month, m.Year } into newGroup
  12.                           let Summa = newGroup.Sum(x => x.Summa)
  13.                           let SumEntrance = newGroup.Sum(x => x.SumEntrance)
  14.                           let SumAdded = newGroup.Sum(x => x.SumAdded)
  15.                           orderby newGroup.Key.Year descending, newGroup.Key.Month ascending
  16.                           select new
  17.                           {
  18.                               newGroup.Key.Month,
  19.                               newGroup.Key.Year,
  20.                               Summa,
  21.                               SumEntrance,
  22.                               SumAdded
  23.                           };

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.667 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут