2

我有一个带有几个继承类的模型。我有一个 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 查询永远不会执行,甚至没有完成。所有表格都会发生这种情况。

有什么建议吗?

4

1 回答 1

0

我的理论是,只做 FirstOrDefault 需要很长时间,因为上下文不知道哪个实体是“第一个”

它基本上是在问自己:第一个 AA?获取实体 1 - 这是...(经过 25 秒)哦,它是 AAH!干得好!

尝试将您的查询投影到可以仅从 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 的 CASE/JOIN 地狱,我刚刚从我的项目中重构了所有 TPT。
我知道像这样使用 SQL Inheritance 感觉既正确又可爱,但是当您必须查看 AA 实例并找出它的真正含义时,它会并且会灼伤您。

于 2014-01-04T00:03:36.723 回答