Asp.net mvc LINQ投影应该是强类型的吗
我在一个MVC项目中有一个聚合数据视图,它显示按审核状态细分的每月总数。控制器代码使用一个简单的LINQ投影将其设置为匿名对象,如下所示:Asp.net mvc LINQ投影应该是强类型的吗,asp.net-mvc,linq,projection,strong-typing,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)
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)。对此有什么一般性的建议吗?处理此问题的文章、博客或其他地方,以及何时使用哪个?您不能在方法范围之外使用匿名类型。例如,您不能将它们返回到视图中。在这些情况下,您必须使用已知类型 当我选择然后以另一种方式处理的数据时,我使用匿名类型。例如,使用Linq从一个源中选择一些定制数据,然后放入另一个源中 如果返回聚合数据,例如
IEnumerable
和TKey
和TValue
是匿名类型(如果需要,可以按匿名类型分组);那么您就不想为TKey
和TValue
创建两个类,其中TKey
有一个被覆盖的Equals
和GetHashCode
,这样您就可以按它分组了。然后什么也不做,只是从中读取一些值并扔掉,永远不要重复使用
TLDR在不需要创建已知类型来存储结果时使用它们。如果需要将结果传递到方法范围之外的某个位置,则需要一个类型。一般建议很简单:始终为视图创建专用的viewmodel类型。在您的例子中,它将非常简单,完全包含匿名类中的属性
我知道这似乎是一种不必要的开销,但它会使代码更具可读性和可验证性。匿名类型是在编译时生成的。从运行时的角度来看,它们仍然是强类型的——它们只有编译器生成的名称。