/// <summary> /// Count the sum of agreements and contracts spontaneously and merge them into a table. /// </summary> private async Task <IEnumerable <AgreementSumViewModel> > GetSortedAgreementSum(int year, string customerNumber) { var weighInSumAgreements = await _weighInRepository.GetWeighInSumAgreementAsync(year.ToString(), customerNumber, _ticket) ?? new WeighInSumAgreementDto[0]; var spontaneouslyAgreementQuery = (from t in weighInSumAgreements where t.Skordear == year.ToString() select new { Sort = t.Artikelnamn, HarvestYear = year, Quantity = 0, QuantitySpont = t.Summa }).ToList(); var agreements = await _agreementRepository.GetAgreementsListAsync(customerNumber) ?? new Agreement[0]; var thisYearAgreements = agreements.Where(a => a.HarvestYear == year); // Do summation of quantitatives by grouping by sort, harvest year var agreementQuery = (from t in thisYearAgreements group t by new { t.Sort, t.HarvestYear } into grp select new { grp.Key.Sort, grp.Key.HarvestYear, Quantity = grp.Sum(t => t.Weighed), QuantitySpont = 0 }).ToList(); var leftAgreementSumList = from aq in agreementQuery join saq in spontaneouslyAgreementQuery on aq.Sort equals saq.Sort into lq from saq in lq.DefaultIfEmpty() select new AgreementSumViewModel { Sort = aq?.Sort, Quantity = aq?.Quantity ?? 0, QuantitySpont = saq?.QuantitySpont ?? 0 }; var rightAgreementSumList = from saq in spontaneouslyAgreementQuery join aq in agreementQuery on saq.Sort equals aq.Sort into lq from aq in lq.DefaultIfEmpty() select new AgreementSumViewModel { Sort = saq?.Sort, Quantity = aq?.Quantity ?? 0, QuantitySpont = saq?.QuantitySpont ?? 0 }; var agreementSumList = leftAgreementSumList .Union(rightAgreementSumList) .Distinct(new AgreementSumComparer()) .OrderBy(x => x.Sort); return(agreementSumList); }