2011-10-26 10 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.

私は既にここでいくつかの答えを見ましたが、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

'query'の種類は何ですか? –

+0

@LadislavMrnkaクエリタイプ –

答えて

0

これは醜いですが、それはあなたが必要なもののために動作します:

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

それは1つのクエリで実行されます! :)

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); 
} 
関連する問題