网络矩阵检查项目是否在集合中,返回布尔值
本文关键字:集合 返回 布尔值 是否 检查 项目 网络 | 更新日期: 2023-09-27 18:37:18
@{
Layout = "~/_SiteLayout.cshtml";
Page.Title = "Training";
var positionID = "";
positionID = Request.QueryString["ID"];
var db = Database.Open("Training");
var courselist = db.Query("SELECT title, ID FROM courses");
var selectedCourses = db.Query("SELECT course_id from positioncourses WHERE position_id = @0", positionID);
}
<h1>Select or deselect courses for this position:</h1>
@foreach(var item in courselist){
<label for="courseID">
<input type="checkbox" name="courseID" value="@item.id" checked="@(selectedCourses.Contains(item.ID))" /> @item.title
</label>
}
上述代码块的结果是:
"编译器错误消息:CS1973:"System.Collections.Generic.IEnumerable"没有名为"包含"的适用方法,但似乎具有该名称的扩展方法。无法动态调度扩展方法。请考虑强制转换动态参数或调用没有扩展方法语法的扩展方法。
导致错误的原因是什么?我不够先进,无法从错误消息本身中破译。
此错误是由以下事实引起的:Query 方法返回动态类型的集合,并且不能对动态使用扩展方法。您必须在编译时将动态强制转换为强类型。以下方法应该有效:
// as before
var courselist = db.Query("SELECT title, ID FROM courses");
var selectedCourses = db.Query("SELECT course_id from positioncourses WHERE position_id = @0", positionID).Select(c => (int)c.course_id);
}
<h1>Select or deselect courses for this position:</h1>
@foreach(var item in courselist.Select(i => (int)i.ID)){
<label for="courseID">
<input type="checkbox" name="courseID" value="@item.id" checked="@(selectedCourses.Contains(item))" /> @courselist.First(c => c.ID == item).title
</label>
}
请注意转换为 int
,它将selectedCourses
从 IEnumerable<dynamic>
转换为 IEnumerable<int>
,并再次将courselist
中的IDs
与title
分开,以便将ints
与ints
进行比较。
你已经使用了 db。查询,数据库。查询返回项目集合(IEnumerable),如果您尝试返回一个结果,请将其更改为 db。查询单。
var selectedCourses = db.QuerySingle("SELECT course_id from positioncourses WHERE position_id = @0", positionID);