Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF DbSet.SqlQuery与TPH继承_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# EF DbSet.SqlQuery与TPH继承

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

使用EF 6,我试图检索一组实体,但是这些实体是从单个表(TPH)中的单个抽象类继承的类的层次结构,因此我看到以下错误:

InvalidOperationException:抽象类的实例不能是 创造

这是一个简单的例子。实体具有唯一的
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类型,但由于某种原因,如果您自己编写查询,即使您返回相同的字段,它也无法简单地打开鉴别器并创建正确的类型。然后是在内部类中这样做的方法使得自己不可能这样做。我们最好还是坚持狂欢。