如何从多个分组数据viewbag中获取Key?

How to get Key from multiple grouped data viewbag?

控制器

我有按 2 个字段分组的数据

lst = db.Database.SqlQuery<GridReportViewModel>(sqlquery).ToList();
Viewbag.DataGrid = lst.GroupBy(x => new { x.PosisiJabatanId, x.AplikasiId });

查看

如何从分组数据中获取Key

@{int i = 1;}
@foreach (var item in @ViewBag.DataGrid)
{
    @:<tr>
        <td>@i</td>
        @*<td>@item.Key.PosisiJabatanId</td>*@ @*ERROR*@
        foreach (GridReportViewModel item2 in @item)
        {
            <td>@item2.NilaiKolom</td>
        }
        i = i + 1;
    @:</tr>
}

错误:'object' 不包含 'Key'

的定义

调试项目: enter image description here

你用匿名类型值填充了你的 ViewBag 并且你不能将它们转换为 View,你应该改变这一行

lst.GroupBy(x => new { x.PosisiJabatanId, x.AplikasiId });

lst.GroupBy(x => new MyObject { x.PosisiJabatanId, x.AplikasiId });

并在 View

中将 ViewBag 转换为 MyObject
@foreach (var item in (MyObject)ViewBag.DataGrid) {...}

在您的查询中添加 select,如下所示

   lst = db.Database.SqlQuery<GridReportViewModel>(sqlquery).ToList();
        Viewbag.DataGrid = lst.GroupBy(x => new { x.PosisiJabatanId, x.AplikasiId })
            .Select(g => new { Key = g.Key, Items = g.ToList() });

在您的视图中使用如下

@{int i = 1;}
@foreach (var item in @ViewBag.DataGrid)
{
    @:<tr>
        <td>@i</td>
        <td>@item.Key.PosisiJabatanId</td>
        foreach (GridReportViewModel item2 in @item.Items)
        {
            <td>@item2.NilaiKolom</td>
        }
        i = i + 1;
    @:</tr>
}

您需要使用 属性 获取数据。 当你使用 new 时,它是 return 匿名对象,所以你需要使用动态对象。 获得动态对象 key 的值后,您需要再次使用动态对象 val.

@{int i = 1;}
@foreach (var item in @ViewBag.DataGrid)
{
    @:<tr>
    <td>@i</td>
    var val = item.GetType()
           .GetProperty("Key")
           .GetValue(item);

    var PosisiJabatanId = val.GetType()
           .GetProperty("PosisiJabatanId")
           .GetValue(val);

    var AplikasiId = val.GetType()
          .GetProperty("AplikasiId")
          .GetValue(val);

    <td>@PosisiJabatanId</td>
    <td>@AplikasiId</td>

    i = i + 1;
@:</tr>
}