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

Lazy loading occurring for some reason when DeferredLoadingEnabled is false

我正在使用 LinqToSql 并且为了 防止 延迟加载每个数据上下文都有这个设置:

DeferredLoadingEnabled = false

现在,我使用的数据上下文添加了 3 个子 table 作为加载选项。 类似于:

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 table 和 return 和 IQueryable<Entity1>.

上执行简单的 select
IQueryable<Entity1> myQuery = GetMyEntity1Collection();

然后我有一段代码将 Entity1 中的特定内容 select 转化为匿名对象,然后构建一个具有相关属性的 slim 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 是一个子 table,它有 Entity1 的外键。 如您所见,它是 not 作为加载选项加载的,我不想加载它。 当我 运行 这个时,我在我的 sql 分析器中看到多个查询,实际上每次都加载 Entity15 (对我来说看起来像一个延迟加载)。

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

我在调试模式下进入该方法,执行了 ToList(执行了 IQueryable)并检查了 Entity15HasLoadedOrAssignedValuesfalse 与我 wanted 完全一样,但是当我在 ForEach 中放置一个断点时,我将其视为 true.
有人对此有任何想法吗?

好的,我找到答案了:

首先,我发现 LinqToSql 在加载多个一对多表时存在问题,如您所见 here and here

当我枚举可查询时,它只是忽略了 loadwith,这就是调试模式下的 ToList() 给出与枚举期间不同的结果的原因。