F# 查询表达式自联接

F# 查询表达式自联接,f#,computation-expression,query-expressions,F#,Computation Expression,Query Expressions,如何更改此查询表达式的join子句,使我不必在选项中包装parent.ID,而只加入可能是None的候选child.ParentID query { for parent in d.People do join child in d.People on (Some parent.ID = child.ParentID) exists (child.Birthdate <= parent.Birthdate) } query{查找d中的父项。人们会这样做 在

如何更改此查询表达式的
join
子句,使我不必在
选项中包装
parent.ID
,而只加入可能是
None
的候选
child.ParentID

query { for parent in d.People do
        join child in d.People on (Some parent.ID = child.ParentID)
        exists (child.Birthdate <= parent.Birthdate) }
query{查找d中的父项。人们会这样做
在d.People上加入子项(Some parent.ID=child.ParentID)

exists(child.Birthdate您可能会喜欢这样。这种方法可能有一种更优雅的语法,我希望它最终不会有太大的不同,如果有的话,但它是:

query { for child in d.People do
        where (child.ParentID.IsSome)
        join parent in d.People on (child.ParentID.Value = parent.ID)
        exists (child.Birthdate <= parent.Birthdate) }

为了保持父项优先,并将子筛选器放在联接条件之前,您可以执行子查询,但这似乎是一个更糟糕的解决方案,而不是更好的解决方案。如果有人知道不使用子查询的方法,请添加注释。

我猜此模型属于无性生殖的血统。为什么包装是一个问题?它似乎很适合数据l、 我只是想避免这种额外的分配和构造函数,尽可能降低这种情况下的开销。我想知道是否还有另一种我不知道的受支持且更有效的语法。如果这被转换为SQL并在数据库中运行,为什么会有任何额外的分配或构造函数?@uosſif performance is cri首先,您不应该使用linq。
query { for parent in d.People do
        join child in d.People on (parent.ID = child.ParentID.Value)
        where (child.ParentID.IsSome)
        exists (child.Birthdate <= parent.Birthdate) }