代码之家  ›  专栏  ›  技术社区  ›  Lwrnc Crz

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

  •  0
  • Lwrnc Crz  · 技术社区  · 6 年前

    我想显示总和。QualificationBatch中CompendiumId的所有实例的插槽,以及同样的所有总和。在SAP中放置所有CompendiumId实例,并将其显示在如下表中:

    概要|总计。座位总数。插槽

    Id1 |座1 |槽1

    Id2 |座2 |槽2

    经过大量阅读,我认为使用GroupBy可以做到这一点,但我无法让它发挥作用,因为我对所有东西都相当陌生,即使是操作列表或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; }
    }
    

    视图模型

    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);
            }
    

    我对其他方法持开放态度,我只是把控制器的代码放在上面,以显示我一直在尝试的内容。在这里,我试图让它先为一张桌子工作,但我已经被困在这里了,因为它不工作。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Abhilash Ravindran C K    6 年前

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

    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)                                    
                            });  
    
        2
  •  0
  •   Harald Coppoolse    6 年前

    因此,每个QualificationBatch都有一个属性补足了一个int属性槽。

    每个SAP都有一个属性补偿。它还具有int属性Seats。

    现在很明显,您有资格批次和SAP的序列,并且您需要每个补偿插槽和座位的值

    小步骤:

    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,
         });
    

    待办事项:发表一项声明

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