禁用LINQ上下文的所有延迟加载或强制加载加载

时间:2010-08-02 13:37:46

标签: c# linq linq-to-sql lazy-loading eager-loading

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

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

有没有办法让我为上下文禁用延迟加载或显式启用急切加载来忽略延迟加载属性?也许扩展DB上下文类并覆盖一些东西?

2 个答案:

答案 0 :(得分: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 :(得分:0)

使用LINQ to SQL这很棘手。简而言之,这取决于。

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

Customers -> Orders -> OrderDetails

你需要评估所有3个实体的属性才能做出决定,你最好的选择是写一个连接。使用.LoadWith将使用单个语句获取CustomersOrders,但之后也会为每个OrderDetails记录发出查询。

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