Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc LINQ投影应该是强类型的吗_Asp.net Mvc_Linq_Projection_Strong Typing - Fatal编程技术网

Asp.net 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)

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

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

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

如果返回聚合数据,例如
IEnumerable
TKey
TValue
是匿名类型(如果需要,可以按匿名类型分组);那么您就不想为
TKey
TValue
创建两个类,其中
TKey
有一个被覆盖的
Equals
GetHashCode
,这样您就可以按它分组了。然后什么也不做,只是从中读取一些值并扔掉,永远不要重复使用


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

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


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

匿名类型是在编译时生成的。从运行时的角度来看,它们仍然是强类型的——它们只有编译器生成的名称。