我在MVC项目中有一个聚合数据视图,它显示按审计状态细分的每月总计。控制器代码使用简单的LINQ投影将其设置为匿名对象,如下所示:
From audits In db.Audits
Group By key = audits.DateCreated.Value.Month Into g = Group
Select New With {
.Month = key,
.Assigned = g.Sum(AuditsWithStatus(AuditStatus.Issued)),
.Unassigned = g.Sum(AuditsWithStatus(AuditStatus.Pending)),
.Closed = g.Sum(AuditsWithStatus(AuditStatus.Closed)),
.Cancelled = g.Sum(AuditsWithStatus(AuditStatus.Cancelled))
}
我知道这是LINQ(使用匿名类型)的一大优势,但我不喜欢在视图中丢失强类型(即@ModelType SomeStrongType)。对此有什么一般性的建议吗?文章,博客或其他处理问题以及何时使用的地方?
答案 0 :(得分:3)
您不能对方法范围之外的匿名类型执行任何操作。例如,您无法将它们返回到视图中。在这些情况下,您必须使用已知类型。
当我选择我正在以另一种方式处理的数据时,我使用匿名类型。例如,使用Linq从1个源中选择一些定制数据,然后放入另一个源。
如果要返回IEnumerable<IGrouping<TKey, TValue>>
和TKey
以及TValue
等聚合数据是匿名类型(如果需要,可以按匿名类型分组);然后你不想为TKey
和TValue
创建2个类,其中TKey
有一个被覆盖的Equals
和GetHashCode
,所以你可以按它分组。然后再做一些事情,只需从中读取一些值并扔掉它,永远不要重复使用。
TLDR; 在不需要创建已知类型来存储结果时使用它们。如果您需要将结果传递到方法范围之外的某个位置,那么您将需要一个类型。
答案 1 :(得分:0)
一般建议很简单:始终为视图创建专用的viewmodel类型。在您的情况下,它将非常简单,包含您在匿名类中的属性。
我理解这似乎是一种不必要的开销,但它会使您的代码更具可读性和可验证性。