当 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
)并检查了 Entity15
,HasLoadedOrAssignedValues
是 false 与我 wanted 完全一样,但是当我在 ForEach
中放置一个断点时,我将其视为 true.
有人对此有任何想法吗?
好的,我找到答案了:
首先,我发现 LinqToSql 在加载多个一对多表时存在问题,如您所见 here and here。
当我枚举可查询时,它只是忽略了 loadwith,这就是调试模式下的 ToList() 给出与枚举期间不同的结果的原因。
我正在使用 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>
.
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
)并检查了 Entity15
,HasLoadedOrAssignedValues
是 false 与我 wanted 完全一样,但是当我在 ForEach
中放置一个断点时,我将其视为 true.
有人对此有任何想法吗?
好的,我找到答案了:
首先,我发现 LinqToSql 在加载多个一对多表时存在问题,如您所见 here and here。
当我枚举可查询时,它只是忽略了 loadwith,这就是调试模式下的 ToList() 给出与枚举期间不同的结果的原因。