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

このエラーは、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>
}

fromを tointに変換するtoのキャストに注意してください。selectedCoursesIEnumerable<dynamic>IEnumerable<int>IDscourselisttitleintsints

于 2013-10-29T21:12:28.450 に答える
0

db.Query を使用しました。db.Query はアイテムのコレクション (IEnumerable) を返します。1 つの結果を返そうとしている場合は、それを db.QuerySingle に変更します。

var selectedCourses = db.QuerySingle("SELECT course_id from positioncourses WHERE position_id = @0", positionID);
于 2013-10-29T20:58:32.727 に答える