无论如何,我都不是 LINQ 高级用户,但可以在基本级别上摸索。我有一个关于 LINQ 如何制定它的查询“策略”的问题。我将尽力解释这一点,并根据内存编写一个极其简单的示例。
我有一个包含多个数据库 View 的数据模型。假设 View 具有如下列结构:
人物 View
PersonViewId | Surname | GivenName | OtherViewId
------------------------------------------------
其他 View View
OtherViewId | PersonViewId | Name
---------------------------------
在设置 View 的主键 (PersonView.PersonViewId/OtherView.OtherViewId) 并将适当的字段设置为不可为空后,我在 PersonView.PersonViewId(父级)与 OtherView.PersonViewId(子级)之间创建关联。我将它设置为“一对一”并编写一些代码来使用它:
StringBuilder s = new StringBuilder();
foreach(PersonView p in dc.PersonViews)
{
s.AppendLine(p.OtherViews.Name + "<br />");
}
在注意到性能极差之后,我分析了数据库并注意到它正在为 foreach 语句中的每个 PersonView 执行查询。
此时我重写了查询并将 DBML 中的关联替换为 LINQ 查询中的 JOIN,分析了数据库并按预期查询了数据库,仅一次。
我认为这与实际查询数据库有关,但我不确定在哪里调试它。有人可以指出正确的方向来帮助我提高使用关联的性能,还是我坚持使用 JOIN 来完成我需要的?
谢谢:)
最佳答案
这是由延迟加载引起的 - 您可以通过应用 LoadWith()
来解决这个问题(相当于 EF 的 Include()
用于 Linq to SQL),然后执行您的查询:
var dlo = new DataLoadOptions();
dlo.LoadWith<PersonView>(p => p.OtherViews);
dc.LoadOptions = dlo;
//your query here
关于c# - LINQ 执行多个查询而不是单个 "joined"查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5627627/