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 »не имеет применимого метода с именем« Содержит », но, по-видимому, имеет метод расширения с таким именем. Методы расширения не могут быть отправлены динамически. Рассмотрите возможность приведения динамических аргументов или вызова метода метод расширения без синтаксиса метода расширения».

Что вызывает ошибку? Я недостаточно продвинут, чтобы расшифровать само сообщение об ошибке.


person John Merchant    schedule 29.10.2013    source источник
comment
checked=@(selectedCourses.Contains(item.ID)) //должно возвращать true или false, в результате чего флажок установлен или нет.   -  person John Merchant    schedule 30.10.2013


Ответы (2)


Ошибка вызвана тем, что метод 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.

person Mike Brind    schedule 29.10.2013
comment
Когда я удаляю .id из [email protected], он работает отлично. При этом выдается ошибка «int», не содержащая определения для «id», и не может быть найден метод расширения «id», принимающий первый аргумент типа «int» (вам не хватает директивы использования или ссылки на сборку?), но все равно возвращает правильное значение. Ваша помощь была неоценима. - person John Merchant; 30.10.2013

Вы использовали db.Query, db.Query возвращает набор элементов (IEnumerable), если вы пытаетесь вернуть один результат, измените его на db.QuerySingle.

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