Webmatrix检查项目是否在集合中,返回布尔值

时间:2013-10-29 20:23:34

标签: c# razor webmatrix

   @{ 
        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'的适用方法,但似乎有一个名称的扩展方法。扩展方法不能动态调度。考虑转换动态参数或者在没有扩展方法语法的情况下调用扩展方法。“

导致错误的原因是什么?我不够先进,无法从错误信息本身中解读。

2 个答案:

答案 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,将selectedCoursesIEnumerable<dynamic>转换为IEnumerable<int>,然后再将其转换为IDs courselist来自title,以便您将intsints进行比较。