这似乎是一个常见的问题,但我找不到任何可以让我得到我想要的解决方案。
我有一个数据库,其中包含我的应用程序实体的主表。该表具有“类型”列,L2S使用discriminator属性值实例化正确的派生类。我有大约10种不同的实体类型,具有一些继承级别。这非常有效。
我希望有一种方法来创建一些“GetEntityById()”,甚至可能是一个“GetAllEntities()”函数,这些函数读取数据库并返回一个完全加载的实体,在datacontext关闭后可以离线使用,所以我需要渴望加载一些关系。这是我使用L2S DataLoadOptions的地方。
根据实体的类型,加载不同的东西。加载的一些东西也使用类型继承映射
例如,我希望能够做到这一点:
options.LoadWith<Entity>(p => p.CommonClass);
options.LoadWith<DerivedEntity1>(p => p.Foo);
options.LoadWith<DerivedEntity2>(p => p.Bar);
options.LoadWith<Bar>(p => p.EvenMoreSpecificClass);
options.LoadWith<DerivedBar>(p => p.EvenMoreSpecificClass2);
现在,当然,如果我加载DerivedEntity1类型的实体,我不希望加载EvenMoreSpecificClass / EvenMoreSpecificClass2的规则产生任何影响。
现在我退后一步,发现只使用这一行是有问题的:
options.LoadWith<DerivedEntity2>(p => p.Bar);
由于Bar具有Type Inheritance规则,因此L2S处理它非常糟糕。我描述了查询,我遇到的问题似乎与此处描述的完全相同(无用的OUTER JOIN):http://connect.microsoft.com/VisualStudio/feedback/details/361683/using-dataloadoptions-with-a-linq-to-sql-inheritance-hierarchy-results-in-multiple-sql-left-joins。遗憾的是,无法应用变通方法,因为使用此方法我无法根据基本类型指定不同的包含规则。
仅仅用于加载单个继承的一对一关系的单个继承实体需要10秒并生成惊人数量的连接。当进一步推送LoadWith规则并一次加载多个实体时,我希望它需要一些时间并完成一个极端查询,但更糟糕的是:整个操作系统开始偶尔冻结。我以前从未经历过这种行为(通常你可以杀死这个过程),并且它在另一台PC上执行完全相同的操作并且两者都非常强大,所以这里显然是错误的。
现在,我的问题是: