我有一个文档生成器,目前包含大约200个项的查询,但完成后可能会增加到500个。我最近注意到一些映射表示懒加载。这对于文档生成器来说是个问题,因为它需要访问基于正在生成的文档的所有这些属性。
虽然我知道可以指定DataLoadOptions
给上下文,但这将导致我必须明确指定可能被加载的每一列。由于所有数据获取都在一个上下文中进行,因此这超过了1000个。
是否有任何办法可以禁用上下文的惰性加载或显式启用急切加载以忽略延迟加载属性?也许通过扩展DB上下文类并覆盖某些内容?
我有一个文档生成器,目前包含大约200个项的查询,但完成后可能会增加到500个。我最近注意到一些映射表示懒加载。这对于文档生成器来说是个问题,因为它需要访问基于正在生成的文档的所有这些属性。
虽然我知道可以指定DataLoadOptions
给上下文,但这将导致我必须明确指定可能被加载的每一列。由于所有数据获取都在一个上下文中进行,因此这超过了1000个。
是否有任何办法可以禁用上下文的惰性加载或显式启用急切加载以忽略延迟加载属性?也许通过扩展DB上下文类并覆盖某些内容?
您需要设置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);
}
GetProperties()
方法迭代它们,如何过滤掉只有System.Data.Linq.Table
类型的属性? - Jake Whartonpi.PropertyType.Name == "Table
1"`。 - Jan Jongboom使用LINQ to SQL处理这个问题有点棘手。简短的答案是,这取决于情况。
如果您的实体布局方式与以下关系相似:
Customers -> Orders -> OrderDetails
并且您需要评估所有3个实体的属性才能做出决策,那么最好的方法是编写一个联接查询。使用.LoadWith
将使用单个语句获取Customers
和Orders
,但然后还会为每个OrderDetails
记录发出查询。
因此,即使您使用LoadWith指定了每个子关系,也不会发出单个查询以检索结果。