2016-08-17 209 views
0

我有一个方法来检索两个列表。 和我显示基于联盟的列表。如何结合并总结基于唯一ID的两个列表的结果

,但我想总结基础上,唯一的ID是FC_Id

public List<ContractFundingCategory> CalculateContractFundingCategoryAmountbyPurchaseOrder(int poId, string serviceType) 
{ 
    List<ContractFundingCategory> lstContractFundingCategory = new List<ContractFundingCategory>(); 

    var lstContractFundingCategoryEbs = 
     (
      from payment in context.PaymentDetails 
      join reimEbs in context.Reimbursement_EBSUtilization on payment.REU_Id equals reimEbs.Id into ebs_join 
      from reimEbs in ebs_join.DefaultIfEmpty() 
      join purc in context.PurchaseOrders on payment.PO_Id equals purc.Id 
      join serviceDetail in context.fServiceDetails on reimEbs.SD_Id equals serviceDetail.Id 
      join fundingCategory in context.fFundingCategories on serviceDetail.FC_Id equals fundingCategory.Id into fundingCategory_Join 
      from fundingCategory in fundingCategory_Join.DefaultIfEmpty() 
      where payment.PO_Id == poId && (serviceDetail.ServiceType == serviceType) 
      group new { fundingCategory, payment, serviceDetail } by new 
      { 
       fundingCategory.Id, 
       serviceDetail.ServiceType, 
      } into grp 
      select new 
      { 
       FC_Id = grp.Key.Id, 
       serviceType = grp.Key.ServiceType, 
       BudgetAmount = grp.Sum(p => p.payment.PaymentAmount), 
      } 
     ) 
     .AsEnumerable().Select(x => new ContractFundingCategory 
     { 
      FC_Id = x.FC_Id, 
      BudgetAmount = x.BudgetAmount, 
      ServiceType = x.serviceType.ToString() 
     }).ToList(); 


    var lstContractFundingCategoryCds = 
     (
      from payment in context.PaymentDetails 
      join reimCds in context.Reimbursement_CDSUtilization on payment.RCU_Id equals reimCds.Id into cds_join 
      from reimCds in cds_join.DefaultIfEmpty() 
      join cdsutil in context.CDSUtilizations on reimCds.CDSU_Id equals cdsutil.Id 
      join purc in context.PurchaseOrders on payment.PO_Id equals purc.Id 
      join serviceDetail in context.fServiceDetails on cdsutil.ServiceDetail_Id equals serviceDetail.Id 
      join fundingCategory in context.fFundingCategories on serviceDetail.FC_Id equals fundingCategory.Id into fundingCategory_Join 
      from fundingCategory in fundingCategory_Join.DefaultIfEmpty() 
      where payment.PO_Id == poId && (serviceDetail.ServiceType == serviceType) 
      group new { fundingCategory, payment, serviceDetail } by new 
      { 
       fundingCategory.Id, 
       serviceDetail.ServiceType, 
      } into grp 
      select new 
      { 
       FC_Id = grp.Key.Id, 
       serviceType = grp.Key.ServiceType, 
       BudgetAmount = grp.Sum(p => p.payment.PaymentAmount), 
      } 
     ) 
     .AsEnumerable().Select(x => new ContractFundingCategory 
     { 
      FC_Id = x.FC_Id, 
      BudgetAmount = x.BudgetAmount, 
      ServiceType = x.serviceType.ToString() 
     }).ToList(); 

    //lstContractFundingCategory.AddRange(lstContractFundingCategoryEbs); 
    //lstContractFundingCategory.AddRange(lstContractFundingCategoryCds); 

    //List<ContractFundingCategory> a = new List<ContractFundingCategory>(); 

    lstContractFundingCategory = lstContractFundingCategoryEbs 
     .Union(lstContractFundingCategoryCds) 
     .ToList(); 

    return lstContractFundingCategory; 

} 

任何一个可以帮助我走出编写循环语句

+6

作为一般性评论:请不要将您的代码复制并粘贴到SO中。花点时间把它缩小到足够小,这样人们不必为了看看你做了什么而水平滚动太多。 – phil13131

回答

0
lstContractFundingCategory.Aggregate(new Dictionary<int,int>(), (acc,elem) => { acc.ContainsKey(elem.FC_Id) ? acc[elem.FC_Id] += elem.BudgetAmount : acc.Add(elem.FC_Id, elem.BudgetAmount); return acc; }); 

总金额为折叠类似物,其迭代你的值并将它们应用到累加器。在这种情况下,我们提供了一个新的字典作为累加器。匿名函数检查字典是否有你的密钥;如果确实如此,则它将预算值添加到当前值,并且如果它不添加具有初始预算值的密钥。它将返回一个字典,其中的键是唯一的FC_Id,它们的值是这些预算的总和。