2011-10-26 29 views
8

Cho phép nói rằng tôi có một số User với 2 thực thể có nguồn gốc Student, Teacher. Tôi đã sử dụng phương pháp TPH, vì vậy tôi thực sự không có tài sản nào cả trong lớp học của mình để cho tôi biết ai là giáo viên hay không.Bộ lọc với nhiều lớp dẫn xuất có Khung thực thể mã đầu tiên

tôi có 2 phép toán luận rằng nên cho phép tôi để tải một trong hai sinh viên hoặc giáo viên như thế này:

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

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

Khi điều này cố gắng để đánh giá, tôi nhận được lỗi này khi cả hai đều đúng:

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

Tôi đã xem xét một số câu trả lời ở đây trên SO nhưng chúng được hướng tới 1 loại lọc.

Sau đó tôi muốn làm một cái gì đó như thế này (mã hóa thô):

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

Các bản đồ:

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

Bạn có thể cho chúng tôi thấy các lớp học của bạn không? Bạn đang sử dụng mã đầu tiên? Bạn có thể chia sẻ bất kỳ mã bản đồ nào? –

+0

Loại truy vấn 'là gì? –

+0

@LadislavMrnka Tôi đã thêm loại truy vấn –

Trả lời

0

này là xấu xí nhưng nó sẽ làm việc cho những gì bạn cần:

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

Và Nó sẽ chạy trên một truy vấn !! :)

5

Hãy thử cái này. Nó hoạt động ít nhất cho 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); 
} 
Các vấn đề liên quan