2011-10-26 12 views
8

Powiedzmy, że mam User z 2 elementami pochodnymi: Student, Teacher. Użyłem metody TPH, więc w rzeczywistości nie mam żadnej własności na zajęciach, aby powiedzieć mi, kto jest nauczycielem, czy nie.Filtr z wieloma klasami pochodnymi z Code-first Entity Framework

Mam 2 wartości logicznych, które powinny pozwolić mi załadować albo ucznia lub nauczyciela, takie jak ten:

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

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

Gdy ta stara się ocenić, otrzymuję ten błąd, gdy oba są prawdziwe:

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

Już sprawdziłem niektóre odpowiedzi tutaj na SO, ale są one ukierunkowane na 1 rodzaj filtrowania.

bym wtedy zrobić coś tak (szorstkiej Coding):

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

Odwzorowanie:

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")); 
    } 
+0

Czy możesz pokazać nam swoje zajęcia? Czy korzystasz najpierw z kodu? Jakiś kod mapowania, który możesz udostępnić? –

+0

Co to jest "zapytanie"? –

+0

@LadislavMrnka Dodałem zapytanie typu –

Odpowiedz

0

To jest brzydki, ale to będzie działać, czego potrzebujesz:

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

I będzie działać na jedno zapytanie !! :)

5

Wypróbuj ten. Działa co najmniej dla 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); 
} 
Powiązane problemy