我在 MVC 项目中有一个聚合数据 View ,其中显示按审核状态分割的每月总计。 Controller 代码使用简单的 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(使用匿名类型)的一大优势,但我不喜欢在 View 中丢失强类型(即 @ModelType SomeStrongType)。对此有什么一般建议吗?处理该问题的文章、博客或其他地方以及何时使用哪些?
最佳答案
您不能在方法范围之外对匿名类型执行任何操作。例如,您无法将它们返回到您的 View 中。在这些情况下,您必须使用已知类型。
当我选择然后以其他方式处理的数据时,我使用匿名类型。例如,使用 Linq 从 1 个源中选择一些定制数据,然后放入另一个源中。
如果您要返回聚合数据,例如 IEnumerable<IGrouping<TKey, TValue>>
和TKey
和TValue
是匿名类型(如果需要,您可以按匿名类型分组);那么你不会想为 TKey
创建 2 个类和TValue
,其中TKey
有一个被覆盖的Equals
和GetHashCode
这样你就可以按它分组。然后什么也不做,只是从中读取一些值并将其丢弃,永远不会重复使用。
TLDR;当不需要创建已知类型来存储结果时使用它们。如果您需要将结果传递到方法范围之外的某个位置,那么您将需要一个类型。
关于asp.net-mvc - LINQ 投影是否应该是强类型的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11630693/