c# - 使用代码优先 Entity Framework 过滤多个派生类

标签 c# entity-framework entity-framework-4.1

假设我有一个 User,它有 2 个派生实体 StudentTeacher。我使用了 TPH 方法,所以我实际上在我的类(class)中根本没有属性来告诉我谁是老师。

我有 2 个 bool 值,可以让我加载学生或老师,如下所示:

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

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

当这尝试求值时,当两者都为真时我得到这个错误:

DbIsOfExpression 需要一个具有与类型参数兼容的多态结果类型的表达式参数。

我已经在 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);
}

关于c# - 使用代码优先 Entity Framework 过滤多个派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7897327/

相关文章:

c# - 在一处处理 EF SqlException

c# - 我在 foreach 期间收到 "Collection was modified; enumeration operation may not execute."

wcf - EF 4.1 Code First - 使用新上下文/WCF 时未更新 FK 值的更改

c# - 将表添加到现有数据库代码首先 MVC 5 EF6

c# - 内存数据库中的 SqlLite : CREATE TABLE does not work?

c# - 可怕又大的 LINQ 语句优化

林克。如何在 Linq(sql 语法)查询中使用 AsEnumerable? EF4.1

c# - 如何知道异步调用何时真正开始?

c# - 将 WebImage 上传到 FTP

c# - 通过 SimpleInjector 注册单例并返回相同的实例,对于它实现的不同接口(interface)