你可以在你的抽象类中定义一个鉴别器属性(基本上是你想要作为鉴别器的列的名称,作为一个字符串)
说,您将Component 类作为抽象类,而FirstNameComponent 正在继承它。
所以,你希望你的 Component 类看起来像 -
public abstract class Component
{
public const string Discriminator = "ComponentType";
// Other properties/methods
}
现在,您的 FirstNameComponent 课程看起来像 -
public class FirstNameComponent : Component
{
public const string TypeOfComponent = nameof(FirstNameComponent);
public override string ComponentType // your discriminator column
{
get
{
return TypeOfComponent;
}
}
// Other properties/methods
}
并在使用上下文中的流式 API 构建模型时使用此属性..
public class ComponentContext: DbContext
{
public DbSet<FirstNameComponent> FirstNameComponents { get; set; }
// Other mappings
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Component>()
.Map<FirstNameComponent>(
configuration =>
configuration.Requires(Component.Discriminator).HasValue(FirstNameComponent.TypeOfComponent))
}
}
因此,您的查询将类似于 -
var components = ComponentContext.Components.OfType<FirstNameComponent>();
甚至——
var components = ComponentContext.Components.Where(c => c is FirstNameComponent).ToList();
更新
看看你更新的问题,这里是你如何重组你的查询来获取特定类型的Component -
string sqlQuery = @"Select * from Components Where ComponentType = @componentType";
string componentType = nameof(FirstNameComponent); //Can be made more dynamic
// Pass the type of component you need to cast to as a parameter
SqlParameter parameter = new SqlParameter("@componentType", componentType);
var components = DbContext.Database.SqlQuery<FirstNameComponent>(sqlQuery, parameter);
这应该会给你想要的结果。
更新 2
因此,在对此进行了更多研究之后,我发现了 this 博客,其中讨论了使用 Linq to Entities 和 EntitySQL 进行多态查询。
根据参考资料,您可以尝试另一种方法来获取所有Components -
string sqlQuery = @"SELECT VALUE c FROM Components AS c";
System.Data.Entity.Core.Objects.ObjectContext objectContext = ((IObjectContextAdapter)ComponentContext).ObjectContext;
System.Data.Entity.Core.Objects.ObjectQuery<Component> objectQuery = objectContext.CreateQuery<Component>(sqlQuery);
List<Component> components = objectQuery.ToList<Component>();
一旦你拥有了所有的Components,你就可以在ComponentType 字段上使用一个简单的Where 子句过滤出所需的类型 -
var firstNameComponents = components.Where(c => c.ComponentType == nameof(FirstNameComponent)).ToList();