当DeferredLoadingEnabled为false时,由于某种原因发生延迟加载

时间:2015-02-23 15:13:11

标签: c# .net linq-to-sql lazy-loading

我使用LinqToSql并且为了阻止延迟加载每个datacontext都有此设置:

DeferredLoadingEnabled = false

现在,我使用的数据上下文将3个子表添加为loadoption。 类似的东西:

EntitiesDataContext dc = new EntitiesDataContext(connectionString);
dc.DeferredLoadingEnabled = false;
LoadOptions lo = new LoadOptions();
lo.LoadWith<Entity1>(e => e.Entity2);
lo.LoadWith<Entity1>(e => e.Entity3);
lo.LoadWith<Entity1>(e => e.Entity4);
dc.Loadoptions = lo;

我在Entity1表格上执行简单选择并返回IQueryable<Entity1>

IQueryable<Entity1> myQuery = GetMyEntity1Collection();

然后我有一段代码从Entity1中选择特定的东西到一个匿名对象中,然后构建一个具有相关属性的简洁Entity1 - 这样做是为了提高性能因为Entity1包含我不想加载的大型xml列:

myQuery.Select(item => 
    new
    {
       A = item.A,
       B = item.B,
       ....
       Entity15 = item.Entity15
    }).ForEach(item => 
    new Entity1
    {
       A = item.A,
       B = item.B,
       ....
       Entity15 = item.Entity15
    })
);

对于记录,ForEach是一个自定义扩展方法,如下所示:

   public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
   {
        foreach (var item in source)
        {
           action(item);
        }
    }

我的问题:

Entity15是一个具有Entity1外键的子表。 它是作为loadoption加载,你可以看到,我不希望它被加载。 当我运行这个时,我在我的sql profiler中看到每次实际加载Entity15的多个查询(看起来像是一个懒惰的加载)。

现在我不知道为什么会这样。我认为这与创建的匿名对象有关,但我真的不知道。

我已经在调试模式下输入了该方法,执行了ToList(执行了IQueryable)并检查了Entity15HasLoadedOrAssignedValues false 想要完全一样,但是当我在ForEach内放置断点时,我将其视为 true
有人对这个有任何想法吗?

1 个答案:

答案 0 :(得分:0)

好的,我找到了答案:

首先,我发现LinqToSql在加载多个一个到多个表时遇到问题,因为您可以看到herehere

当我枚举查询时,它只是忽略了loadwith,以及为什么调试模式下的ToList()给出的结果与枚举时不同。