Как запрашивать объекты с наследованием типа «одна таблица на тип» (платформа Entity Framework)

В этом разделе описано, как выполнить полиморфный запрос с использованием оператора OfType.

Выполнение кода в этом примере

  1. Добавьте School, модель в проект и настройте его на использование Entity Framework . Дополнительные сведения см. в разделе Как использовать мастер моделей EDM (платформа Entity Framework).

  2. Измените концептуальную модель для реализации наследования типа «одна таблица на тип», выполнив шаги, приведенные в пошаговом руководстве Walkthrough: Mapping Inheritance - Table per Type.

Пример

В следующем примере метод OfType возвращает и отображает коллекции OnsiteCourses и OnlineCourses из коллекции Courses. Коллекции OnsiteCourses и OnlineCourses являются определенными типами Courses.

Try
    Using context As New SchoolEntities()
        Dim departmentID = 7
        ' Get courses for the department with id 7. 
        Dim courses As IQueryable(Of Course) = _
            context.Departments.Where(Function(d) d.DepartmentID = departmentID).SelectMany(Function(d) d.Courses)

        Console.WriteLine("All the courses for the selected department.")
        For Each course As Course In courses

            Console.WriteLine("CourseID: {0} ", course.CourseID)
        Next
        Dim onlineCourses = courses.OfType(Of OnlineCourse)()
        Console.WriteLine("Online courses only for the selected department.")
        For Each onlineCourse As OnlineCourse In onlineCourses

            Console.WriteLine("CourseID: {0} ", onlineCourse.CourseID)
        Next
        Dim onsiteCourses = courses.OfType(Of OnsiteCourse)()
        Console.WriteLine("Onsite courses only for the selected department.")
        For Each onsite As OnsiteCourse In onsiteCourses

            Console.WriteLine("CourseID: {0} ", onsite.CourseID)
        Next

    End Using
Catch e As System.Data.MappingException
    Console.WriteLine(e.ToString())
Catch e As System.Data.EntityException
    Console.WriteLine(e.ToString())
End Try
try
{
    using (SchoolEntities context =
                          new SchoolEntities())
    {
        int departmentID = 7;
        // Get courses for the department with id 7.
        IQueryable<Course> courses = context.Departments
                .Where(d => d.DepartmentID == departmentID)
                .SelectMany(d => d.Courses);

        Console.WriteLine("All the courses for the selected department.");
        foreach (Course course in courses)
        {
            Console.WriteLine("CourseID: {0} ", course.CourseID);

        }
        var onlineCourses = courses.OfType<OnlineCourse>();
        Console.WriteLine("Online courses only for the selected department.");
        foreach (OnlineCourse onlineCourse in onlineCourses)
        {
            Console.WriteLine("CourseID: {0} ", onlineCourse.CourseID);

        }
        var onsiteCourses = courses.OfType<OnsiteCourse>();
        Console.WriteLine("Onsite courses only for the selected department.");
        foreach (OnsiteCourse onsite in onsiteCourses)
        {
            Console.WriteLine("CourseID: {0} ", onsite.CourseID);

        }
    }

}
catch (System.Data.MappingException e)
{
    Console.WriteLine(e.ToString());
}
catch (System.Data.EntityException e)
{
    Console.WriteLine(e.ToString());
}

См. также

Задачи

Как определить модель с наследованием «одна таблица на тип» (платформа Entity Framework)

Другие ресурсы

Определение расширенных моделей данных (задачи платформы Entity Framework)