繁体   English   中英

使用Code-first Entity Framework过滤多个派生类

[英]Filter with multiple derived classes with Code-first Entity Framework

假设我有一个带有2个派生实体的User StudentTeacher 我使用了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上查看了一些答案,但它们适用于一种类型的过滤。

我想做这样的事情(粗略编码):

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

试试这个吧。 它至少适用于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);
}

这很难看,但它可以满足您的需求:

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

它将在一个查询上运行!! :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM