Linq向实体TPC和渴望加载子类关系

时间:2012-10-06 09:43:29

标签: linq-to-entities table-per-class

感谢您的想法

我正在使用实体框架5.0,首先是模型。

使用每个类(或每个具体类型的表)模式的表来映射表。

表A 1 ......许多(摘要)表B

表B有2个子类

B1& B2

B2有第三个表的外键,比如表C(许多B2 ... 1 C),但这不是父类B的属性。

预先加载是应用程序的默认设置,我想在表B2上查询时包含表(或集合)C - 相当于(伪linq到实体):

from A in _db.A
.Include(A=>A.B.OfType<B2>())
.Include(A=>A.B.OfType<B2>().Include(C))
select A

感谢您对我如何强制加载此表的任何想法

1 个答案:

答案 0 :(得分:2)

问题的核心是Include(A=>A.B.OfType<B2>())不受支持。

据我了解ADO.Net团队,他们似乎不想支持部分加载的子集合。 (而且我倾向于同意它们。)在Linq-to-sql中有DataLoadOptions,但没有EF等价物。这可以解释为什么Include OfType也不受支持,因为它会告诉EF部分加载B s的集合。

此外,扩展方法Include只是IQueryable对象本身的Include方法(如果存在)的包装器。 取ObjectQuery.Include:一个非常简单的方法,只有一个字符串作为参数(DbQuery.Include相同),其中包含要包含的导航属性的路径(_db.A.Include("B"))。换句话说:您只能使用可以解析为MemberExpression的字符串。 B.OfType<>()是一种方法。

长篇解释为什么不能包含C:导致C的路径无效。

可以

_db.B.OfType<B2>().Include(b => b.A).Include(b => b.C)

但这可能不会给你你所追求的结果。