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“, но изглежда има метод за разширение с това име. Методите за разширение не могат да бъдат динамично изпратени. Помислете за прехвърляне на динамичните аргументи или извикване на метод на разширение без синтаксис на метод на разширение."

Какво причинява грешката? Не съм достатъчно напреднал, за да дешифрирам от самото съобщение за грешка.


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