.Where in list 给出了在 2sxc 中使用动态类型的错误

.Where in list gives error for using dynamic types in 2sxc

我有这个工作代码:

@{
      var ekgList = AsList(App.Data["Ekgs"]);
      foreach(var ekg in ekgList) {
          <div>
              @foreach (var entitiesFromSinusDataType in ekg.Sinus) {
                  if(entitiesFromSinusDataType.EntityId == Content.EntityId) {
                      <a>@ekg.ShortName</a>
                  }
              }
          </div>
     }
}

据我了解:

应该有一个简单的方法来删除第二个循环和 "if",方法是在第一个循环中放置一个 where 子句。 我正在一步一步地尝试这个,但是一旦我尝试这个:

@{
      var ekgList = AsList(App.Data["Ekgs"]);
      foreach(var ekg in ekgList) {
          <div>
              @foreach (var entitiesFromSinusDataType in ekg.Sinus.Where(i => i.EntityId == Content.EntityId)) {
                  <a>@ekg.ShortName</a>
              }
          </div>
     }
}

我收到这个错误:

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

这似乎是使用动态类型造成的。

有什么方法可以将列表转换成它们的非动态版本吗?

尝试将 ekg.Sinus 转换为 ((IEnumerable<dynamic>)ekg.Sinus)

((IEnumerable<dynamic>)ekg.Sinus).Where(i => i.EntityId == Content.EntityId)

希望对您有所帮助。

这是因为编译器无法猜测 ekg.Sinus 是一个列表 - 因此不会自动解析 LINQ 扩展。请注意,您也可以从 2sxc 10.25 开始执行此操作:

AsList(ekg.Sinus).Where(...)

或者如果这不起作用(同样有时编译器无法猜测所有内容)做:

AsList(ekg.Sinus as object).Where(...)

我还建议您查看 LINQ 教程 https://2sxc.org/dnn-tutorials/en/razor/linq/home