Выбор одной строки с помощью EF в MVC 3 vb.net

#asp.net-mvc #vb.net #asp.net-mvc-3 #entity-framework

#asp.net-mvc #vb.net #asp.net-mvc-3 #структура сущности

Вопрос:

Я пытаюсь вернуть один из модели базы данных EF, используя приведенную ниже строку кода..

 Dim _classRoom As classrm = db.classrms.Select(Function(b) b.Course_ID = _CurrCourse.course_ref)
 

Где classrm — это имя объекта, а db объявляется как новый объект. То, что я пытаюсь сделать, это выбрать строку из объекта на основе соответствия Course_ID, который в этой модели является строкой. Чтобы позже я мог использовать переменную _classRoom для получения других элементов из той же строки.. Однако я получаю следующую ошибку:

    Unable to cast object of type 'System.Data.Objects.ObjectQuery`1[System.Boolean]' to type 'Trial_Online.classrm'.
 

У кого-нибудь есть идеи??? Мне приходится выполнять аналогичные задачи с несколькими разными объектами, но если я укажу правильное направление, я смогу управлять оттуда…

Ответ №1:

Используйте Where вместо Select для фильтрации результатов и добавьте First() или Single() в конец:

 Dim _classRoom As classrm = db.classrms.Where(Function(b) b.Course_ID = _CurrCourse.course_ref).First()
 

Разница между First() и Single() заключается в том, что Single() будет генерироваться исключение, если в результате будет более 1 элемента. Оба выдадут исключение, если результирующая последовательность пуста.

Вы также можете использовать FirstOrDefault() и SingleOrDefault() для возврата Nothing , если результатов нет.

Ответ №2:

Не слишком знаком с синтаксисом запроса в VB.NET , но в C # я почти уверен, что вам нужно добавить First() или Single() в конец запроса, чтобы он проецировал результат в экземпляр объекта. В противном случае, я думаю, вы получите результирующий набор (возможно IQueryable , объект).