2011-10-26 21 views
8

Digamos que tengo un User con 2 entidades derivadas Student, Teacher. Utilicé el método TPH, así que no tengo ninguna propiedad en mis clases para decirme quién es profesor o no.Filtro con múltiples clases derivadas con Code-first Entity Framework

tengo 2 booleanos ésta para proceder a mí para cargar ya sea estudiante o profesor como este:

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

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

Cuando esto trata de evaluar, consigo este error cuando ambas son ciertas:

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

Ya he visto algunas respuestas aquí en SO pero están orientadas a 1 tipo de filtrado.

Después me gustaría hacer algo como esto (codificación en bruto):

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

El mapeo:

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

¿Podría mostrarnos sus clases? ¿Estás usando código primero? ¿Algún código de mapeo que puedas compartir? –

+0

¿Qué es un tipo de 'consulta'? –

+0

@LadislavMrnka Agregué el tipo de consulta –

Respuesta

0

Ésta es feo, pero va a trabajar para lo que necesita:

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

Y correrá en una consulta !! :)

5

Pruebe este. Funciona al menos para 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); 
} 
Cuestiones relacionadas