Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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 6表SQL查询生成问题_C#_Linq_Entity Framework_Code First_Table Per Hierarchy - Fatal编程技术网

C# 每个层次结构的代码第一个EF 6表SQL查询生成问题

C# 每个层次结构的代码第一个EF 6表SQL查询生成问题,c#,linq,entity-framework,code-first,table-per-hierarchy,C#,Linq,Entity Framework,Code First,Table Per Hierarchy,我有一个模型,它有几个继承类。我有一个4级层次结构: --First level abstrac class A --Second level abstrac class AA --Third level: *abstract class AAA *abstract class AAB *abstract class AAC *class AAD *class AAE *abstract class AAF *cl

我有一个模型,它有几个继承类。我有一个4级层次结构:

--First level abstrac class A
  --Second level abstrac class AA
    --Third level:
     *abstract class AAA
     *abstract class AAB
     *abstract class AAC
     *class AAD
     *class AAE
     *abstract class AAF
     *class AAG
     *class AAH
     *abstract class AAI
       --Fourth level:
        *class AAA1
        *class AAA2
        *class AAA3
        *class AAB1
        *class AAB2
        *class AAB3
        *class AAC1
        *class AAC2
          ...
        *class AAF1
        *class AAF2
        *class AAF3
        *class AAF4
        *class AAF5
这只是层次结构之一。至少还有3个,比较简单。它们之间有几个关系,几乎所有类都有7个以上的属性

现在,我使用每种类型的表,但当我执行一个简单的LINQ查询时,如:

        using (Logic.Context dc = new Logic.Context())
        {
            var prod = dc.AA.FirstOrDefault();
        }
AA包含所有子类。当数据库为空时,执行此简单测试大约需要25秒。使用第四级类执行相同的LINQ查询只需2秒钟

我已经尝试迁移到每个层次结构的表中,默认情况下,数据库是使用列鉴别器生成的,但是相同的测试需要永远。。。LINQ查询从未执行,甚至没有完成。所有表都会发生这种情况


有什么建议吗?

我的理论是,只做First或default要花很长时间,因为上下文不知道哪个实体是“First”

它基本上是在问自己:第一个AA?获取实体1-它是。。。(25秒过去了)哦,是啊!给你

尝试将查询投影到一个对象上,该对象可以仅从AA获取所有属性

例如,如果AA是

class AA 
{
   public Int32 Id {get;set;}
   public String Name {get;set;}
   public DateTime Created {get;set;}
}
如果您这样做,您的查询可能会运行得更快

var prod = dc.AA.Select( a => new 
{ 
    Id = a.Id, 
    Name = a.Name, 
    Created = a.Created 
}).FirstOrDefault();
那么在理论上,EF可能不会关心第一个实体实际上是什么

但是..

当我在这里的时候- 由于EF的案例/加入地狱,我刚刚重构了我项目中的所有TPT。

我知道这样使用SQL继承感觉很好,但当你必须查看AA实例并找出它的真正含义时,它可能会也会让你感到痛苦。

好吧,我刚刚放弃了TPH的想法,继续使用TPT。为了避免25秒的等待,我只是避免AA。在我的项目中,我使用反射来避免表AA,结果很好,但是编程有点困难。通过反射,我可以在3或4秒内查询AA的所有项目。