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

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

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

Помогите разобраться с запросом. Есть следующие 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; }
    }
Мне нужно сформировать единый сгруппированный список со следующими полями: Месяц, Год, Summa, SumEntrance, SumAdded Вот получил 2 списка с полями:
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
                          };

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


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

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

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