LINQ投影应该是强类型的

时间:2012-07-24 12:17:09

标签: asp.net-mvc linq projection strong-typing

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

2 个答案:

答案 0 :(得分:3)

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

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

如果要返回IEnumerable<IGrouping<TKey, TValue>>TKey以及TValue等聚合数据是匿名类型(如果需要,可以按匿名类型分组);然后你不想为TKeyTValue创建2个类,其中TKey有一个被覆盖的EqualsGetHashCode,所以你可以按它分组。然后再做一些事情,只需从中读取一些值并扔掉它,永远不要重复使用。

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

答案 1 :(得分:0)

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

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