LINQ执行多个查询,而不是单个“join”查询;查询
本文关键字:查询 单个 join 执行 LINQ | 更新日期: 2023-09-27 17:49:39
无论如何我都不是一个LINQ的高级用户,但可以在基本级别上摸索自己的方式。我有一个关于LINQ如何制定它的查询"策略"的问题。我将尽我所能解释这一点,并通过记忆写一个极其简化的例子。
我有一个包含多个数据库视图的数据模型。假设视图的列结构如下:
PersonView
PersonViewId | Surname | GivenName | OtherViewId
------------------------------------------------
OtherView视图
OtherViewId | PersonViewId | Name
---------------------------------
在为视图设置主键之后(PersonView。PersonView/OtherView.OtherViewId)并将适当的字段设置为不可空的,我创建了PersonView之间的关联。personviewwid (Parent)到OtherView。PersonViewId(孩子)。我将其设置为"一对一",并编写一些代码来使用它:
StringBuilder s = new StringBuilder();
foreach(PersonView p in dc.PersonViews)
{
s.AppendLine(p.OtherViews.Name + "<br />");
}
在注意到极其糟糕的性能之后,我对数据库进行了分析,并注意到它正在对foreach语句中的每个PersonView进行查询。
此时,我重写了查询,并用LINQ查询中的JOIN替换了DBML中的关联,对数据库进行了概要分析,并按预期查询了DB,只有一次。
我认为这与DB实际上正在查询有关,但我不确定在哪里调试。有人能指出我在正确的方向上,以帮助我提高使用关联的性能,或者我被困在使用JOIN来完成我需要什么?
谢谢:)
这是由延迟加载引起的-您可以通过应用LoadWith()
(相当于EF的Linq to SQL的Include()
)然后在之后进行查询来解决这个问题:
var dlo = new DataLoadOptions();
dlo.LoadWith<PersonView>(p => p.OtherViews);
dc.LoadOptions = dlo;
//your query here
这是LINQ-2-SQL的延迟加载(又名延迟加载)功能在错误,当你做p.OtherViews.Name
它正在做一个查询你的OtherViews
表。
dc.DeferredLoadingEnabled = false;
另一种方法是把你想要的结果都投影出来,并使用投影:
var people = from p in dc.PersonViews
select new {
Person = p,
Name = p.OtherViews.Name
};
然后是BrokenGlass的建议,直到现在我才知道:-)
你看到这个的原因是Linq对这些关系使用延迟加载。换句话说,Linq不会加载关联,直到你真正尝试使用它。
这有助于提高性能,因为如果不总是需要关联,就不会执行不必要的JOIN,也不会检索不需要的数据。
如果你确定你需要数据,它会损害性能,并且它会不断地发出请求。
您可以通过保持关联原样来解决这个问题,但是使用DataLoadOptions。例如:
var dc = new DataContext();
dc.DeferredLoadingEnabled = false;
DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<PersonView>(o => o.OtherView);
dc.LoadOptions = loadoptions;
现在,任何时候你查询一个PersonView,它会自动加载OtherView关系。
这种方法的好处是您可以在需要时打开和关闭它。