asp.net-mvc - LINQ 投影是否应该是强类型的

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

我在 MVC 项目中有一个聚合数据 View ,其中显示按审核状态分割的每月总计。 Controller 代码使用简单的 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(使用匿名类型)的一大优势,但我不喜欢在 View 中丢失强类型(即 @ModelType SomeStrongType)。对此有什么一般建议吗?处理该问题的文章、博客或其他地方以及何时使用哪些?

最佳答案

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

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

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

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

关于asp.net-mvc - LINQ 投影是否应该是强类型的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11630693/

相关文章:

c# - 为什么 ToString() 并不总是适用于 DateTime 对象?

asp.net-mvc - 元标记和开放图协议(protocol)问题

c# - 参数数量未知的动态Where子句

python - 数据未绘制,但没有错误

c# - 当对象从另一个类返回时无法保存 Entity Framework 中的更改

c# - 在 LINQ 查询 'if' 语句中实现条件 'where' 语句

c# - 在子查询中涉及计数的高效查询

c# - 墨卡托投影和缩放

math - 如何建立透视投影矩阵(无API)

asp.net-mvc - Java Server Faces 2.0 的主要缺点是什么?