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

时间:2012-11-26 04:40:29

标签: entity-framework entity-framework-4.1 entity-framework-5

假设我有一个Parent类,有两个子类,AChild和BChild。我使用TPH在.NET 4.5上使用Entity Framework 5.0.0映射到单个表。

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

我需要运行一个返回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();
}

这不起作用。它坚持寻找“Type1”列而不是让鉴别器和“Type”属性都映射到相同的“Type”列。

我知道“OfType”扩展方法可用于完全过滤到一种类型,但在这种情况下刷子过于宽泛。

我可能会运行多个查询并合并结果,但我正在构建的实际系统正在进行分页,所以如果我需要撤回10行,那么查询会变得混乱(并且效率低下),因为我要么最终拉回太多行,或者没有足够的回撤,并且必须运行额外的查询。

有没有人有其他想法?

1 个答案:

答案 0 :(得分:1)

几乎没有问题。首先,你不能将鉴别器映射为属性。这就是它寻找Type1列的原因 - 您的Type属性导致第二列,因为第一列已经映射到类的.NET类型。过滤派生类型的唯一方法是OfType

您要构建的查询可能非常复杂,因为您需要查询所有B并将它们与已过滤的As的查询结果连接起来。它很可能不允许你将B的实例与As连接起来,所以你必须将它们转换回父类型。