15

我有一个文档生成器,目前包含对大约 200 个项目的查询,但完成后可能会超过 500 个。我最近注意到一些映射表示延迟加载。这给文档生成器带来了一个问题,因为它需要根据正在生成的文档访问所有这些属性。

虽然我知道DataLoadOptions可以为上下文指定 ,但这将导致我必须明确指定可能加载的每一列。那是 1000 以北,因为它所有的数据获取都发生在一个上下文中。

我有什么方法可以禁用上下文的延迟加载或显式启用急切加载以忽略延迟加载属性?也许扩展数据库上下文类并覆盖某些东西?

4

2 回答 2

7

您将需要设置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);
}
于 2010-08-02T13:40:24.347 回答
1

这对于 LINQ to SQL 来说很棘手。简短的回答是,这取决于。

如果您的实体的布局方式使您的关系反映了这一点:

Customers -> Orders -> OrderDetails

而且您需要评估所有 3 个实体的属性才能做出决定,最好的办法是编写连接。Using.LoadWith将获取CustomersOrders使用单个语句,但随后也会对每条OrderDetails记录发出查询。

因此,即使您确实使用 LoadWith 指定了每个子关系,也不会发出单个查询来检索结果。

于 2010-08-02T14:23:23.590 回答