LINQ执行多个查询而不是单个“加入””查询
无论如何我不是LINQ高级用户,但可以在基本级别上摸索。我有一个关于LINQ如何制定它的查询“策略”的问题。我将尝试尽可能地解释这一点,并通过记忆写出一个非常愚蠢的例子。
我有一个包含多个数据库视图的数据模型。假设视图的列结构如下:
PersonView
PersonViewId | Surname | GivenName | OtherViewId
------------------------------------------------
其他视图
OtherViewId | PersonViewId | Name
---------------------------------
在设置视图的主键(PersonView.PersonViewId / OtherView.OtherViewId)并将相应的字段设置为非nulable之后,我在PersonView.PersonViewId(Parent)与OtherView.PersonViewId(Child)之间创建了一个关联。我将它设置为“一对一”并编写一些代码来使用它:
StringBuilder s = new StringBuilder();
foreach(PersonView p in dc.PersonViews)
{
s.AppendLine(p.OtherViews.Name + "<br />");
}
在注意到性能极差之后,我对数据库进行了分析,发现它正在对foreach语句中的每个PersonView进行查询。
此时,我重新编写了查询,并在DBML中将关联替换为LINQ查询中的JOIN,对数据库进行了分析,并按预期查询了数据库,仅查询一次。
我认为这与某些事情有关,然后实际上正在查询数据库,但我不确定在哪里进行调试。有人能指出我正确的方向,以帮助我提高使用协会的表现,还是我坚持使用JOIN来完成我需要的东西?
谢谢 :)
没有找到相关结果
已邀请:
3 个回复
缔恃钨
(相当于Lin的SQL的EF
)来解决这个问题,然后再进行查询:
外镶受继
它在你的
表上进行查询时。 有几种方法可以解决它,一种是关闭延迟加载:
另一种方法是在结果中投射您想要的所有内容,并使用投影:
然后是BrokenGlass的建议,直到现在我都不知道:-)
锑寝粒
现在,无论何时查询PersonView,它都会自动加载OtherView关系。 这种方法的好处是你可以在需要时打开和关闭它。