2

我在 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)。对此有什么一般性建议吗?文章、博客或其他处理该问题的地方以及何时使用哪个?

4

2 回答 2

3

您不能对方法范围之外的匿名类型执行任何操作。例如,您不能将它们返回到您的视图中。在这些情况下,您必须使用已知类型。

当我选择以另一种方式处理的数据时,我使用匿名类型。例如,使用 Linq 从 1 个源中选择一些定制数据,然后放入另一个源。

如果您要返回聚合数据,例如IEnumerable<IGrouping<TKey, TValue>>andTKey并且TValue是匿名类型(如果需要,您可以按匿名类型分组);那么您不想为TKeyand创建 2 个类TValue,其中TKey有一个被覆盖的类EqualsGetHashCode因此您可以按它进行分组。然后什么也不做,只是从中读取一些值并将其扔掉,永远不要重复使用。

TLDR;当不需要创建已知类型来存储结果时使用它们。如果您需要将结果传递到方法范围之外的某个地方,那么您将需要一个类型。

于 2012-07-24T12:50:11.230 回答
0

一般建议很简单:始终为您的视图创建专用的视图模型类型。在您的情况下,它会非常简单,完全包含您在匿名类中拥有的属性。

我知道这似乎是不必要的开销,但它会使您的代码更具可读性和可验证性。

于 2012-07-24T14:14:15.963 回答