2
   @{ 
        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' 的适用方法,但似乎具有该名称的扩展方法。扩展方法无法动态调度。考虑强制转换动态参数或调用没有扩展方法语法的扩展方法。”

是什么导致了错误?我还不够先进,无法从错误消息本身中破译。

4

2 回答 2

0

您使用了 db.Query,db.Query 返回一组项目 (IEnumerable),如果您尝试返回一个结果,请将其更改为 db.QuerySingle。

var selectedCourses = db.QuerySingle("SELECT course_id from positioncourses WHERE position_id = @0", positionID);
于 2013-10-29T20:58:32.727 回答
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转换为将selectedCoursesfromIEnumerable<dynamic>转换IEnumerable<int>为相同的转换以将IDsin 与courselistthe分开,title以便您与 进行ints比较ints

于 2013-10-29T21:12:28.450 回答