Entity framework 实体框架TPH-仅针对一个子类型的附加WHERE子句

Entity framework 实体框架TPH-仅针对一个子类型的附加WHERE子句,entity-framework,entity-framework-4.1,entity-framework-5,Entity Framework,Entity Framework 4.1,Entity Framework 5,假设我有一个类父类,有两个子类,AChild和BChild。我使用.NET4.5上的EntityFramework5.0.0(使用TPH)将这些映射到单个表 public abstract class Parent { public string Type { get; set; } // Column with this name in DB is discriminator. public string Status { get; set; } } public class

假设我有一个类父类,有两个子类,AChild和BChild。我使用.NET4.5上的EntityFramework5.0.0(使用TPH)将这些映射到单个表

public abstract class Parent {
    public string Type { get; set; } // Column with this name in DB is discriminator.
    public string Status { get; set; }
}

public class AChild : Parent {
    // Other stuff.
}

public class BChild : Parent {
    // Other stuff.
}
配置映射的代码:

class ParentConfiguration : EntityTypeConfiguration<Parent> {
    Map((EntityMappingConfiguration<AChild> mapping) => mapping
        .Requires("Type")
        .HasValue("A"));
    Map((EntityMappingConfiguration<BChild> mapping) => mapping
        .Requires("Type")
        .HasValue("B"));
}
类父配置:EntityTypeConfiguration{
映射((EntityMappingConfiguration映射)=>映射
.需要(“类型”)
.HasValue(“A”);
映射((EntityMappingConfiguration映射)=>映射
.需要(“类型”)
.HasValue(“B”);
}
我需要运行一个同时返回AChild和BChild对象的查询。但是,它只需要通过第二列过滤AChild行,在本例中,我将调用Status

理想情况下,我希望做到以下几点:

public IList<Parent> RunQuery() {
    IQueryable<Parent> query =
        this.context.Set<Parent>()
        .Where((Parent parent) => !parent.Type.Equals("A") || parent.Status.Equals("Foo"))
        .OrderBy((Parent parent) => parent.Number);
    return query.ToList();
}
public IList RunQuery(){
可查询查询=
this.context.Set()
其中((Parent-Parent)=>!Parent.Type.Equals(“A”)| | Parent.Status.Equals(“Foo”))
.OrderBy((父项)=>父项编号);
返回query.ToList();
}
这不管用。它坚持寻找一个“Type1”列,而不是让鉴别器和“Type”属性都映射到同一个“Type”列

我知道“OfType”扩展方法可以用来完全过滤到一种类型,但在这种情况下,它的范围太广了

我可能会运行多个查询并合并结果,但我正在构建的实际系统正在进行分页,因此,如果我需要回拉10行,查询会变得混乱(而且效率低下),因为我要么会回拉太多行,要么回拉不够,不得不运行额外的查询


有人有其他想法吗?

没有什么问题。首先,不能将鉴别器映射为属性。这就是它查找
Type1
列的原因-您的
Type
属性会在第二列中出现,因为第一列已经映射到类的.NET类型。筛选派生类型的唯一方法是通过类型的


您想要构建的查询可能会非常复杂,因为您需要查询所有的B,并将它们与查询结果连接起来,以便筛选为。它很可能不允许您将Bs实例与连接起来,因此您必须将它们转换回父类型。

是的,这似乎是EF的一个限制。在理想情况下,我们还可以将鉴别器映射到属性——这将在查询中提供更大的灵活性。也许我会把它添加到uservoice中。