Объединение данных по дате через 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
};