假设我有一个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行,那么查询会变得混乱(并且效率低下),因为我要么最终拉回太多行,或者没有足够的回撤,并且必须运行额外的查询。
有没有人有其他想法?
答案 0 :(得分:1)
几乎没有问题。首先,你不能将鉴别器映射为属性。这就是它寻找Type1
列的原因 - 您的Type
属性导致第二列,因为第一列已经映射到类的.NET类型。过滤派生类型的唯一方法是OfType
。
您要构建的查询可能非常复杂,因为您需要查询所有B并将它们与已过滤的As的查询结果连接起来。它很可能不允许你将B的实例与As连接起来,所以你必须将它们转换回父类型。