Фильтр с несколькими производными классами с помощью Code-first Entity Framework - PullRequest
9 голосов
/ 26 октября 2011

Допустим, у меня есть User с 2 производными сущностями Student, Teacher.Я использовал метод TPH, поэтому у меня на занятиях вообще нет никакого свойства, чтобы сказать мне, кто учитель или нет.

У меня есть 2 логических значения, которые должны позволять мне загружать или ученика, или учителя, такого как этот:

//IQueryable<User>
var query = userRepository.GetUsers();

//Type filtering
if (searchModel.IsStudent)
{
    query = query.OfType<Student>();
}
if (searchModel.IsTeacher)
{
    query = query.OfType<Teacher>();
}

Когда это пытается оценить, я получаю эту ошибку, когда оба истинны:

DbIsOfExpression requires an expression argument with a polymorphic result type that is compatible with the type argument.

Я уже смотрел некоторые ответы здесь на SO, ноони ориентированы на 1 тип фильтрации.

Затем я хотел бы сделать что-то вроде этого (грубое кодирование):

if(query.ToList().FirstOrDefault() is Student)
{
     print "student";
}

Отображение:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
                    .Map<Teacher>(m => m.Requires("UserType").HasValue("Teach"))
                    .Map<Student>(m => m.Requires("UserType").HasValue("Stu"))
                    .Map<Staff>(m => m.Requires("UserType").HasValue("Staff"));
    }

Ответы [ 2 ]

5 голосов
/ 26 марта 2014

Попробуйте это. Работает как минимум на EF 5.

IQueryable<User> Filter(this IQueryable<User> query, 
    bool includeTeacher, bool includeStudent)
{

  return query.Where(x => includeTeacher && x is Teacher
                || includeStudent && x is Student);
}
1 голос
/ 27 октября 2011

Это некрасиво, но оно будет работать для того, что вам нужно:

if (searchModel.IsStudent && searchModel.IsTeacher) 
{
    var result = context.Users.OfType<Teacher>()
                        .Cast<User>()
                        .Union(context.Users.OfType<Student>());
}

И будет работать по одному запросу !!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...