【发布时间】:2018-07-06 23:10:15
【问题描述】:
我正在学习 EF,并试图了解何时使用哪种类型的查询。
例如这个查询:
From fe In Processes.Where(Function(process) CBool(process.Type = 21 And
process.State = 0 And
process.VDat > #2017/01/01# And
process.ProcessAdresses.Any(Function(adr) adr.AdrNr = "0201") And
process.ProcessPorisitions.Any(Function(pp) pp.ArtID = 200)))
将返回 Type=21、State=0、Vdat>01.01.2017 中的所有 processes,其中 processAdress 和 AdrNr=0201 和 position 和 ArtId=200。
这里使用了导航属性并且必须启用延迟加载。 (我认为,因为需要加载相关数据,并且在访问导航道具时会加载)
现在我可以使用连接来表达相同的查询:
From fe In Processes.Where(
Function(process) CBool(
process.Art = 215 And
process.State = 0 And
process.VDat > #2017/01/01#))
Join adr In ProcessAdresses.Where(
Function(adr) adr.AdrNr = "020107")
On fe.VID Equals vadr.VID
Join pp In ProcessPorisitions.Where(
Function(pp) pp.ArtID = 20004993)
On fe.VID Equals vpos.VID
Group By fe Into Group
Select fe
这里没有使用导航道具。
我试图使用 LinqPad 测量/分析性能,但我只能看到创建的 SQL 查询中的差异,不费吹灰之力......
所以我的问题是:
- 查询一种方式与查询另一种方式的主要区别是什么?
- 在使用其中一种时是否有任何规则可遵循?
- 在这种情况下或一般的 SQL 查询中,我如何才能弄乱性能?
【问题讨论】:
标签: sql database performance entity-framework linq