C# EF DbSet.SqlQuery与TPH继承
使用EF 6,我试图检索一组实体,但是这些实体是从单个表(TPH)中的单个抽象类继承的类的层次结构,因此我看到以下错误: InvalidOperationException:抽象类的实例不能是 创造 这是一个简单的例子。实体具有唯一的C# EF DbSet.SqlQuery与TPH继承,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,使用EF 6,我试图检索一组实体,但是这些实体是从单个表(TPH)中的单个抽象类继承的类的层次结构,因此我看到以下错误: InvalidOperationException:抽象类的实例不能是 创造 这是一个简单的例子。实体具有唯一的id键,尝试使用SqlQuery的原因是仅在一个查询中检索一组id,而不是在循环中多次调用Find: myContext.myHierarchy.Find(eachId) 我尝试使用: List<myBaseClass> myResult = myCo
id
键,尝试使用SqlQuery的原因是仅在一个查询中检索一组id
,而不是在循环中多次调用Find
:
myContext.myHierarchy.Find(eachId)
我尝试使用:
List<myBaseClass> myResult = myContext.myHierarchy.SqlQuery("SELECT * FROM dbo.myHierarchy AS a INNER JOIN @theIDs AS i ON a.id = i.id",mySqlParameter).ToList();
List myResult=myContext.myHierarchy.SqlQuery(“从dbo.myHierarchy中选择*作为内部联接@theIDs AS i ON a.id=i.id”,mySqlParameter)。ToList();
SqlParameter是一种用户定义的表类型,仅作为int的一列
这种方法产生了上面提到的错误。为什么不将
DbSet
与Contains
查询一起使用呢?那会是:myContext.myHierarchy.Where(a=>theIDs.Contains(a.id))?在这种情况下,你说得对。然而,我建议保留这个问题,以便能够在针对tph的其他查询中使用SqlQuery。这个问题不太有趣:它只是在SqlQuery中不受支持(在EF6中也永远不受支持)@GertArnold不幸的是,我不能花时间分离出一个小的说明性测试用例来支持我的说法。但是EF6将linq查询编译成sql的代码速度很慢。更糟糕的是,如果原始查询具有Where(x=>ids.Contains(x.Id))
,则EF6无法缓存编译后的sql。因此,每次执行此类查询时,都会出现大约200-500毫秒的编译开销。如果你喜欢的话,启动一个剖析器看看。可笑的是,它不受支持。它构建查询,执行查询,并在每个场景中将结果解释为正确的TPH类型,但由于某种原因,如果您自己编写查询,即使您返回相同的字段,它也无法简单地打开鉴别器并创建正确的类型。然后是在内部类中这样做的方法使得自己不可能这样做。我们最好还是坚持狂欢。