@{
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'没有名为'Contains'的适用方法,但似乎有一个名称的扩展方法。扩展方法不能动态调度。考虑转换动态参数或者在没有扩展方法语法的情况下调用扩展方法。“
导致错误的原因是什么?我不够先进,无法从错误信息本身中解读。
答案 0 :(得分:0)
您已经使用过db.Query,db.Query返回一个项集合(IEnumerable),如果您尝试返回一个结果,请将其更改为db.QuerySingle。
var selectedCourses = db.QuerySingle("SELECT course_id from positioncourses WHERE position_id = @0", positionID);
答案 1 :(得分:0)
错误是由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>
,然后再将其转换为IDs
courselist
来自title
,以便您将ints
与ints
进行比较。