2010-08-02 73 views
14

我有一个文件生成包含查询,以目前约200个项目,但可能会是500向上时完成。我最近注意到一些映射表示延迟加载。这对文档生成器提出了一个问题,因为它需要根据正在生成的文档来访问所有这些属性。禁用所有延迟加载或强制预先加载了LINQ方面

虽然我知道可以指定给上下文的DataLoadOptions,但这会导致我不得不显式指定可能可以加载的每列。这是在1000以北,因为所有的数据获取发生在一个上下文中。

有什么办法,我要禁用延迟加载上下文或明确地启用预先加载忽略了延迟加载的财产?也许扩展DB上下文类并重写某些内容?

+0

最终的解决方案:http://gist.github.com/506573 – 2010-08-03 15:42:32

回答

6

您将需要设置DeferredLoadingEnabled,然后包括使用一些反射像每一个属性:

DataLoadOptions dataLoadOptions = new DataLoadOptions(); 

foreach (PropertyInfo pi in typeof(SomeThingyClass).GetProperties()) 
{ 
    ParameterExpression paramExp = Expression.Parameter(typeof(SomeThingyClass), "s"); 
    Expression expr = Expression.Convert(Expression.Property(paramExp, pi.Name), typeof(object)); 
    LambdaExpression lambda = Expression.Lambda(expr, paramExp); 
    dataLoadOptions.LoadWith((Expression<Func<SomeThingyClass, object>>) lambda); 
} 
+1

顺便说一句,什么在EF方面DeferredLoadingEnabled?它是否与context.ContextOptions.LazyLoadingEnabled = true相同? – Martin 2010-08-02 14:05:37

+0

属性也都在不同的表中。如果我使用上下文的'GetProperties()'方法迭代它们,我怎样才能过滤掉'System.Data.Linq.Table'? – 2010-08-02 14:12:47

+0

最简单的方法是检查'pi.PropertyType.Name =='表'1“' – 2010-08-02 14:53:45

0

这是棘手的LINQ到SQL。简短的答案是,这取决于。

如果你的实体的方式布置,使得你有反映此一关系:

Customers -> Orders -> OrderDetails

而你需要以评估在所有3个实体的属性做出决定,你的最好的办法是去写一个连接。使用.LoadWith将使用一个单独的语句获取CustomersOrders,但随后会发出为每一个OrderDetails记录的查询,以及。

所以,即使你没有指定用LoadWith每一个孩子的关系,你不会得到发出检索结果的单个查询。

+0

所有属性都只在被选中的对象上。事实之后不会有任何关系。 – 2010-08-02 14:29:08