我使用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
)并检查了Entity15
,HasLoadedOrAssignedValues
是 false 与想要完全一样,但是当我在ForEach
内放置断点时,我将其视为 true 。
有人对这个有任何想法吗?