2011-10-26 32 views
8

假設我有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")); 
    } 
+0

您能向我們展示您的課程嗎?你是先使用代碼嗎?任何你可以分享的映射代碼? –

+0

什麼是查詢類型? –

+0

@LadislavMrnka我增加了查詢類型 –

回答

0

這是醜陋的,但它會爲你所需要的工作:

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

它會運行在一個查詢! :)

5

試試這個。它至少適用於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); 
} 
相關問題