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

China☆狼群 提交于 2019-12-03 23:41:43

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!