代码优先:由判别者查询。我知道,我不应该这样做

时间:2012-01-23 11:54:59

标签: entity-framework code-first discriminator

我创建了TPH代码优先tmodel,并在所需的discriminator列上添加了NotMappedAttribute。我可以将DbSets添加到我的上下文中,用于子类和查询这些类型的集合,代码优先仍然是我的朋友。

但是,假设我有一个实体,它本身包含一个BaseType集合,其中一些可能是一种类型,另一种类型。如何编写查询以获取键入的记录?顺便说一句,我不希望在延迟加载的内存集合中使用它。

假设一个名为Association的类和一些子类AssocA和AssocB,它们都映射到Associations表并在AssocationTypeId上进行区分。 现在假设你有一个实体 - 为了论证而称之为Employee。例如,

class Employee
{
  public virtual Collection<Associations> MyAssociations {get;set;}
}

现在我想查询数据库以查找AssocA =?的员工。我不希望任何关联等于?但特定类型的关联。我无法使用GetType,因为LinqToEntities无法使用它。我不能使用AttributeTypeId,因为它在代码中首先使用了映射。

我缺少什么?我在做什么是合理的。但我不能模仿它。

1 个答案:

答案 0 :(得分:5)

OfType运营商可能正是您所寻找的:

var query = from e in context.Employees
            where e.MyAssociations.OfType<AssocA>().Any()
            select e;

这将只找到至少有一个AssocA类型的关联的员工。