我在应用程序中使用EF进行数据访问。数据模型(大大简化):
class Project
{
virtual ICollection<Foo> Foos {get;set;}
virtual ICollection<Bar> Bars {get;set;}
// actually I have many more kinds of Project's data
}
class Foo
{
virtual Project Project {get;set;}
virtual ICollection<Bar> LinkedBars {get;set;}
//And they are greatly intervened with each other
}
//etc etc.
重点是:
Foo
,Bar
等等等等有相互之间的引用Project
,即以下始终正确:foo.Bars.All(bar => bar.Project == foo.Project) == true
我加载项目如下:
var project = Db.Set<Project>
.Include(p => p.Foos)
.Include(p => p.Bars);
因此,在那之后,如果我访问某些文件,则会foo.Bars
触发延迟加载。这是预期的,毕竟,我已经即时加载所有需要的数据Project
,Foo
并且Bar
,而不是Foo_Bar
链接表。
让我们修改一下:
var project = Db.Set<Project>
.Include(p => p.Foos.Select(f => f.Bars))
.Include(p => p.Bars);
现在我已经在内存中存储了所有必需的数据,但是(!)生成的SQL显然不是最佳的。其实,EF是装载Project
,Foo
,Foo_Bar
桌子和扫描Bar
两次-一次为p.Bars和一次foo.Bars。所以,我不能不渴望加载foo.Bar_Ids
就渴望加载foo.Bars
,可以吗?
我该怎么做才能改善?
据我所知只有这样,才能获得这个声明Foo_Bars作为明确的联系表(不是EF6自动生成的),并且Include
它
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句