开发者

Disable all lazy loading or force eager loading for a LINQ context

开发者 https://www.devze.com 2023-01-10 01:51 出处:网络
I have a document generator which contains queries for about 200 items a开发者_StackOverflowt the moment but will likely be upwards of 500 when complete. I\'ve recently noticed that some of the mappin

I have a document generator which contains queries for about 200 items a开发者_StackOverflowt the moment but will likely be upwards of 500 when complete. I've recently noticed that some of the mappings denote lazy loading. This presents a problem for the document generator as it needs access to all of these properties based on which document is being generated.

While I am aware of the DataLoadOptions that can be specified to the context, this would result in me having to explicitly specify every column that could possibly be loaded. That is north of 1000 as it all of the data fetching takes place in one context.

Is there any way for me to disable lazy loading for a context or explicitly enable eager loading to ignore the defer loading property? Perhaps extending the DB context class and overriding something?


You will need to set DeferredLoadingEnabled, and then include every property using some reflection like:

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);
}


This is tricky with LINQ to SQL. The short answer is, it depends.

If your entities are laid out in a manner such that you have a relationship that mirrors this:

Customers -> Orders -> OrderDetails

And you need to evaluate properties on all 3 entities in order to make a decision, your best bet is to go with writing a join. Using .LoadWith will fetch Customers and Orders using a single statement, but then will issue a query for every single OrderDetails record as well.

So, even if you did specify every child relationship with LoadWith, you're not going to get a single query issued to retrieve the result.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号