网络矩阵检查项目是否在集合中,返回布尔值


   @{ 
        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,它将selectedCoursesIEnumerable<dynamic> 转换为 IEnumerable<int>,并再次将courselist中的IDstitle分开,以便将intsints进行比较。

你已经使用了 db。查询,数据库。查询返回项目集合(IEnumerable),如果您尝试返回一个结果,请将其更改为 db。查询单。

var selectedCourses = db.QuerySingle("SELECT course_id from positioncourses WHERE position_id = @0", positionID);

最新更新