从两个表中获取一个 ID 的所有实例的总和

Get Sums of All Instances of an Id From Two Tables

我想在 QualificationBatch 中显示所有 CompendiumId 实例的 Sum.Slots,同样,在 SAP 中显示所有 CompendiumId 实例的所有 Sum.Seats,并将其显示在 table像这样:

纲要 |Sum.Seats |Sum.Slots

Id1 |Seats1 |Slots1

Id2 |Seats2 |Slots2

经过大量阅读,我认为使用 GroupBy 可以做到这一点,但我无法让它工作,因为我对所有事情都相当陌生,即使是处理 List 或 IEnumerable 等基础知识。这是我目前所拥有的:

型号

public class Compendium
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<QualificationBatch> QualificationBatches { get; set; }        
    public virtual ICollection<SAP> SAPs { get; set; }
}


public class QualificationBatch
{
    public int Id { get; set; }
    public int CompendiumId { get; set; }
    public int Slots { get; set; }

    public virtual Compendium Compendium { get; set; }
}

public class SAP
{
    public int Id { get; set; }
    public int CompendiumId { get; set; }
    public int Seats { get; set; }

    public virtual Compendium Compendium { get; set; }
}

ViewModel

public class SAPSummaryViewModel
    {        
        public int Id { get; set; } //Compendium
        public int Slots { get; set; } //QualificationBatch
        public int Seats { get; set; } //SAP
    }

控制器

public ActionResult Index()
        {
            List<SAPSummaryViewModel> SAPSummaryViewModelList = new List<SAPSummaryViewModel>();
            var sapsummarylist = (from SP in db.SAPs
                                  join Comp in db.Compendia on SP.CompendiumId equals Comp.Id                                  
                                  select new {Comp.Id, SP.Seats });
            sapsummarylist.GroupBy(i => i.Id).Select(group =>
                                              new
                                              {
                                                  Id = group.Key,
                                                  Sum = group.Sum(item => item.Seats)
                                              });          
            foreach (var item in sapsummarylist)
            {                
                SAPSummaryViewModel objcvm = new SAPSummaryViewModel();              
                objcvm.Id = item.Id;
                objcvm.Seats = item.Seats;                
                SAPSummaryViewModelList.Add(objcvm);
            }
            return View(SAPSummaryViewModelList);
        }

我愿意接受其他方法,我只是将控制器的代码放在上面以展示我一直在尝试的内容。在这里,我试图让它首先为一个 table 工作,但我已经被困在这里,因为它不工作。

以下代码会对您有所帮助,

var sapsummarylist = ( from cmp in Compendium
                       join sp in SAP on cmp.Id equals sp.CompendiumId
                       join qb in QualificationBatch on  on cmp.Id equals qb.CompendiumId
                       group  new { cmp.Id , sp.Seats, qb.Slots } by new { cmp.Id } into mgrp           
                       from grp in mgrp.DefaultIfEmpty() 
                       select new SAPSummaryViewModel { 
                                Id = grp.Id,
                                Seats = mgrp.Sum(x=>x.Seats),
                                Slots = mgrp.Sum(x=>x.Slots)                                    
                        });  

所以每个 QualificationBatch 都有属性 CompendiumId 和 int 属性 Slots.

每个 SAP 也有一个 属性 CompendiumId。它还有一个 int 属性 Seats.

现在显然您有 QualificationBatches 和 SAP 的序列,并且您想要每个 compendiumId 的 Slots 和 Seats 的值

小步骤:

IQueryable<QualificationBatch> qualificationBatches = db.QualificationBatches;
IQueryable<SAP> saps = db.Saps;

var result = qualificationBatches    // join qualificationbatches
    .Join(saps,                      // with saps
    qualificationBatch => qualificationBatch.CompendiumId,
                                     // from every q-batch take the CompendiumId,
    sap => sap.CompendiumId,         // from every sap take the CompendiumId,
    (qualificationBatch, sap)  => new SapSummaryViewModel()
    {                                // when they match make a new SapSummaryViewModel
         Id = qualificationBatch.Id,
         Slots =  qualificationBatch.Slots,
         Seats = qualificationBatch.Seats,
     });

TODO:发表一个声明

请注意,这是一个内部联接:如果您的 SAP 的 CompendiumId 未被任何 QualificationBatch 使用,您将不会在最终结果中获得它。如果您还希望在最终结果中包含这些项目,则需要左外部联接或完全外部联接,具体取决于您的需要。 LINQ 不支持它们,但您可以通过为其编写方法来扩展 LINQ。参见 Whosebug LINQ full outer join