查询表达式自联接

时间:2014-09-19 18:15:26

标签: f# computation-expression query-expressions

如何更改此查询表达式的join子句,以便我不必在parent.ID中包含option只是为了加入候选child.ParentIDNone

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

谢谢!

1 个答案:

答案 0 :(得分:3)

你可能会喜欢这个。这种方法可能有一种更优雅的语法,我希望最终不会有太大的不同,如果有的话,但是这里是:

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) }

我首先想出了这个,但我想知道在过滤掉Value值之前是否意味着调用None

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) }

为了保持父亲的第一个并且在加入条件之前放置子过滤器,你可以做一个子查询,但这似乎是一个更糟糕的解决方案,而不是更好。如果有人知道没有子查询的方法,请添加评论。