在ASP.NET网页中将LINQ与匿名类和隐式类型数组一起使用时出错

本文关键字:数组 类型 一起 出错 网页 NET ASP LINQ | 更新日期: 2023-09-27 17:58:34

我正试图在后台使用WebPages,使用WebMatrix来模拟一个页面。我已经为其中一个PageData键分配了一个隐式类型的匿名对象数组,但当我尝试在集合上使用LINQ方法时,会出现以下错误:

CS1977: Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type

以下是一些示例代码:

@{
  PageData["Vals"] = new [] {
    new { ID=1, Quantity=5 },
    new { ID=2, Quantity=3 }
  };
  var sum = PageData["Vals"].Sum(x => x.Quantity);
}

如果我第一次将数组存储在一个常规对象中,我可以对它使用LINQ方法。当它作为一个动态对象出现在PageData中时,似乎有一个问题——但我似乎不太明白如何将其强制返回到初始类型。

在ASP.NET网页中将LINQ与匿名类和隐式类型数组一起使用时出错

此问题的一般解决方案是显式强制转换。即,将表达式PageData["Vals"]强制转换为所需类型的数组。然而,这不能用于匿名类型,因为您没有其类型的句柄,因此无法强制转换它

一旦将new[] { ... }存储在动态类型的PageData中,就丢失了对匿名类型的所有编译时引用。因此,尝试在其上使用特定类型的LINQ运算符是不可行的。

正如我在评论中提到的,正确的解决方案是始终使用强类型模型。您不应该依赖于在视图中声明和定义的匿名类型来模拟页面。让页面依赖于一个真实的模型,并填充该模型并将其提供给页面。