gpt4 book ai didi

sql - 在 EF 中使用连接或导航属性的区别

转载 作者:搜寻专家 更新时间:2023-10-30 21:49:20 25 4
gpt4 key购买 nike

我正在学习 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=21State=0Vdat>01.01.2017 的所有进程,其中有一个 processAdressAdrNr=0201 和一个 positionArtId=200。这里使用了导航属性,并且必须启用延迟加载。 (我认为,因为需要加载相关数据,并且会在访问导航 Prop 时加载)

现在我可以使用连接表达相同的查询:

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

这里没有使用导航 Prop 。

我试图使用 LinqPad 测量/分析性能,但我只能看到创建的 SQL 查询中的差异,毫不费力...

所以我的问题是:

  • 查询一种方式与查询另一种方式的主要区别是什么?
  • 使用其中一个或另一个时是否有任何规则可遵循?
  • 在这种情况下或一般的 SQL 查询,我怎样才能搞砸性能?

最佳答案

What are the main differences of querying one way to querying the other way?

一看您的代码就足够了。使用导航属性使代码更易于理解和更好地维护。此外,显式连接很容易出错。加入错误的 ID 属性很容易(我见过这种情况)。最后,如果您有更多类似的查询,它会导致重复代码。

Is there any rule to follow for when using one or the other?

指南DRY是其中之一。见上文。

How can I mess performance in such cases or for SQL queries in general?

这可能是规则(指南)的唯一异常(exception)。非强制实体的导航属性将被转换为外部连接。外连接的性能可能比内连接差。因此,当性能很关键时应该从最终结果中过滤掉空引用时,您可以求助于显式连接语句,覆盖导航属性。

另请参阅:Don't use Linq's Join. Navigate! .

关于sql - 在 EF 中使用连接或导航属性的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48481217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com