【问题标题】:Should a LINQ projection be strongly typedLINQ 投影是否应该是强类型的
【发布时间】:2012-07-22 18:15:42
【问题描述】:

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

【问题讨论】:

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

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


【解决方案1】:

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

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

如果您返回聚合数据,例如 IEnumerable<IGrouping<TKey, TValue>>TKeyTValue 是匿名类型(如果需要,您可以按匿名类型分组);那么你就不想为TKeyTValue 创建2 个类,其中TKey 有一个被覆盖的EqualsGetHashCode,所以你可以按它分组。然后什么都不做,只是从中读取一些值并将其丢弃,永远不会被重复使用。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-22
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 2011-01-09
      相关资源
      最近更新 更多