C#GroupBy两把钥匙面临麻烦
在我的控制器中,我想按两列对数据库表记录进行分组 以下是我迄今为止的代码:C#GroupBy两把钥匙面临麻烦,c#,asp.net-mvc,group-by,C#,Asp.net Mvc,Group By,在我的控制器中,我想按两列对数据库表记录进行分组 以下是我迄今为止的代码: List<tblFAM> tblFAMs = db.tblFAMS.Where(x => x.CDate.Year == year && x.Ftype == 1).ToList(); vmMonthlyReport.FByCounty = tblFAMs.GroupBy(x => new { x.code_County.County, x.CDate.Month}) .
List<tblFAM> tblFAMs = db.tblFAMS.Where(x => x.CDate.Year == year && x.Ftype == 1).ToList();
vmMonthlyReport.FByCounty = tblFAMs.GroupBy(x => new { x.code_County.County, x.CDate.Month})
.Select(t => new FByCountyProxy()
{
CountyName = t.Key.County,
MonthName = CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(t.Key.Month),
CountyCount = t.Count()
}).ToList();
我想要的是在顶部只显示一次月份名称(没有重复,因为您可以看到的是从图片中看到的情况)。。。那么在表体中只有3行。。每个县一个。。然后在相应月份的每个td
元素中进行计数
如果按这两列进行分组,我不知道为什么月份和县会重复?此外,如果特定县的计数为0
。。我希望它也能显示出来,而不是一片空白
更新
C#-控制器
List<tblFAM> tblFAMs = db.tblFAMS.Where(x => x.CDate.Year == year && x.Ftype == 1).ToList();
vmMonthlyReport.FByCounty = tblFAMs.GroupBy(x => x.code_County.County).ToList();
List tblFAMs=db.tblFAMs.Where(x=>x.CDate.Year==Year&&x.Ftype==1.ToList();
vmMonthlyReport.FByCounty=tblFAMs.GroupBy(x=>x.code_County.County).ToList();
C#Class
public class vmMonthlyReport
{
public vmMonthlyReport()
{
FByCounty = new List<IGrouping<string, tblFAM>>();();
}
public List<IGrouping<string, tblFAM>> FByCounty { get; set; }
}
公共类vmMonthlyReport
{
公共vmMonthlyReport()
{
FByCounty=新列表();();
}
公共列表FByCounty{get;set;}
}
查看
<table class="table table-bordered table-hover table-responsive">
<thead>
<tr>
<th></th>
@for (var i = 1; i <= 12; i++)
{
<th>
@CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(i)
</th>
}
<th>Total</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.FByCounty)
{
<tr>
<td>@item.Key</td>
@for (var i = 1; i <= 12; i++)
{
<td>
@item.Count(x => x.CDate.Month == i)
</td>
}
@*<td>
@Model.FByCounty.Count(x => x.Key == item.Key)
</td>*@
</tr>
}
</tbody>
</table>
@对于(变量i=1;i x.Key==item.Key)
*@
}
首先要创建月份名称,只需执行以下操作
@foreach (int i = 1; i <= 12; i++)
{
<th>
@CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(i)
</th>
}
@foreach(inti=1;i首先创建月份名称,只需执行以下操作
@foreach (int i = 1; i <= 12; i++)
{
<th>
@CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(i)
</th>
}
@foreach(int i=1;我认为这个答案更好,删除了我的。我现在正在视图中分组,是否需要编辑我的控制器代码?@Grizzly您肯定可以将您使用的模型更改为更好的模式。可以先在县上分组,然后在选择中在月上分组。或者只让您的模型具有每个月的计数例如JanuaryCount=t.Where(x=>x.Month==1.Count()
。好的,我已经开始工作了。还有一件事..如果我想在表的末尾增加一个名为“Total”的列,我需要做什么才能将每行中的所有数字相加,并将总和显示为最后一列中的总和?@Grizzly根据您现在拥有的内容,您需要@item.Count()
总计。这个答案更好,删除了我的。我现在正在视图中分组,是否需要编辑我的控制器代码?@Grizzly您肯定可以将您使用的模型更改为更好的模式。可以先在县上分组,然后在“选择”中对月份进行分组。或者只让您的模型具有计数每个月,比如JanuaryCount=t.Where(x=>x.month==1.Count()
。好的,我让它工作了。还有一件事。如果我想在表的末尾增加一个名为“Total”的列,我需要做什么才能将每行中的所有数字相加,并将总和显示为最后一列中的总和?@Grizzly根据您现在拥有的内容,您需要@item.Count()
。
@foreach (int i = 1; i <= 12; i++)
{
<th>
@CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(i)
</th>
}
<tbody>
@foreach (var item in Model.FByCounty.GroupBy(x => x.CountyName))
{
<tr>
<td>@item.Key</td>
@for(int i = 1; i <= 12; i++)
{
<td>@item.Where(x => x.MonthName == CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(i))
.Select(x => x.CountyCount)
.SingleOrDefault()</td>
}
</tr>
}
</tbody>