.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>
}
}
据我了解:
- ekgList是一个列表(访问数据的标准2sxc代码)
- ekg.Sinus是Ekgs内容类型中的一个字段(实体数据类型,多,从另一种内容类型创建实体列表,
窦)
- Content.EntityId是一个int,等同于entitiesFromSinusDataType.EntityId
应该有一个简单的方法来删除第二个循环和 "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
我有这个工作代码:
@{
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>
}
}
据我了解:
- ekgList是一个列表(访问数据的标准2sxc代码)
- ekg.Sinus是Ekgs内容类型中的一个字段(实体数据类型,多,从另一种内容类型创建实体列表, 窦)
- Content.EntityId是一个int,等同于entitiesFromSinusDataType.EntityId
应该有一个简单的方法来删除第二个循环和 "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