从两个表中获取一个 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
我想在 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