3

可能重复:
Razor 中的动态匿名类型导致 RuntimeBinderException

我有这个 Linq 聚合查询

var GruposQ = from lcGrupos in db.Merlin_ConceptosFacturacion_Kit_Componentes
    where lcGrupos.NumIdConcepto == Item.NumIdConcepto & lcGrupos.BitComponenteVariable == true
    select lcGrupos;

var GruposList = from comps in GruposQ
     group comps by
     new
     {
         NumIdGrupoProducto = comps.NumIdGrupoProducto,
     } into g
     select new
     {
         NumIdTransaccion = NumIdTransaccion,
         NumIdGrupoProducto = g.Key.NumIdGrupoProducto,
         NumCantidad = g.Sum(x=>x.NumCantidad),
         Grupo = GruposQ.Where(x => x.NumIdGrupoProducto == g.Key.NumIdGrupoProducto)
     };


ViewBag.CompsKit = GruposList.ToList();

我的问题是当我尝试从 ViewBag.CompsKit 获取元素时:

@foreach (var myTrans in ViewBag.CompsKit)
{
    // Here it throws an error
    // 'object' does not contain a definition for 'NumIdtransaccion'

    <span>myTrans.NumIdtransaccion</span>
}

但是,如果我查看这个对象,它已经拥有该属性。

myTrans { NumIdTransaccion = 15460
            , NumIdGrupoProducto = 163
            , NumCantidad = 100,000
            , Grupo = System.Data.Common.Internal.Materialization.CompensatingCollection`1[ParadigmaNet.Areas.Items.Models.Merlin_ConceptosFacturacion_Kit_Componentes] }   dynamic {<>f__AnonymousType7<decimal,decimal?,decimal,System.Linq.IQueryable<ParadigmaNet.Areas.Items.Models.Merlin_ConceptosFacturacion_Kit_Componentes>>}

如何访问属性?在这个集合中?

4

2 回答 2

1

您不能在 Razor 视图中使用“动态”类型。

您必须使用类型化对象作为模型。

于 2012-12-19T15:50:17.187 回答
1

您可以在单个查询中进行分组和过滤:

var numIdConcepto = Item.NumIdConcepto;
var query = from comps in db.Merlin_ConceptosFacturacion_Kit_Componentes
            where comps.NumIdConcepto == numIdConcepto &&
                  comps.BitComponenteVariable
            group comps by comps.NumIdGrupoProducto into g
            select new 
            {
               NumIdGrupoProducto = g.Key,
               NumCantidad = g.Sum(x => x.NumCantidad),
               Grupo = g.ToList()
            };        


ViewBag.CompsKit = query.ToList();
ViewBag.NumIdTransaccion = NumIdTransaccion;

  • 您不需要创建匿名对象来按单个属性进行分组
  • 您不需要将布尔值与真/假进行比较
  • 使用单个属性进行分组时,您可以简单地使用 g.Key
  • 组中的项目已经具有 NumIdGrupoProducto 等于分组键
  • 不要将相同的 NumIdTransaccion 分配给查询结果中的每个组,而是将该值传递给单独查看:ViewBag.NumIdTransaccion = NumIdTransaccion

看法:

<span>ViewBag.NumIdTransaccion</span>

@foreach(var item in ViewBag.CompsKit)
{
    <span>@item.NumIdGrupoProducto</span>
    <span>@item.NumCantidad</span>
}

还可以考虑为这个视图创建 ViewModel - 这样您就可以安全地避免拼写错误,并且所有此类错误都将在编译时消除。

于 2012-12-19T15:53:39.413 回答