views:

233

answers:

2

I have a document generator which contains queries for about 200 items at 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?

+2  A: 

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);
}
Jan Jongboom
btw, what's DeferredLoadingEnabled in EF terms? Is it the same as context.ContextOptions.LazyLoadingEnabled = true?
Martin
The properties are all in different tables as well. If I iterate those too using the `GetProperties()` method of the context how can I filter out only the `System.Data.Linq.Table` ones?
Jake Wharton
Easiest is checking whether `pi.PropertyType.Name == "Table`1"`
Jan Jongboom
A: 

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.

Marc
All of the properties are only on the object being selected. No relationships will be followed after the fact.
Jake Wharton