F# 对于leftOuterJoin,.DefaultIfEmpty()是不必要的

F# 对于leftOuterJoin,.DefaultIfEmpty()是不必要的,f#,query-expressions,F#,Query Expressions,leftOuterJoin的文档通过示例反复暗示,当使用leftOuterJoin。。在…上进入..,您仍必须使用.DefaultIfEmpty()以达到所需的效果 我不认为这是必要的,因为我在这两个测试中得到了相同的结果,不同之处在于第二个测试没有。DefaultIfEpmty() 2) 是否有一种方法可以从leftOuterJoin获取None而不是null/一些null 3) 我真正想做的是找出是否有任何不匹配的g printfn "%A" <| query { for g

leftOuterJoin
的文档通过示例反复暗示,当使用
leftOuterJoin。。在…上进入..
,您仍必须使用
.DefaultIfEmpty()
以达到所需的效果

我不认为这是必要的,因为我在这两个测试中得到了相同的结果,不同之处在于第二个测试没有
。DefaultIfEpmty()

2) 是否有一种方法可以从
leftOuterJoin
获取
None
而不是
null
/
一些null

3) 我真正想做的是找出是否有任何不匹配的
g

printfn "%A" <| query {
    for g in G do
    leftOuterJoin h in H on (g = h) into I
    for i in I.NoneIfEmpty do
    where (i.IsNone)
    exists (true) }

printfn“%A”简短版本:查询表达式使用空值。这是语言中的一个粗糙点,但却是可以控制的

我以前做过这件事:

让t选项(a:'a)=
将obj.ReferenceEquals(a,null)与
|正确->无
|错误->某些(a)
这将使您能够:

printfn "%A" <| query {
    for g in G do
    leftOuterJoin h in H on (g = h) into I
    for i in I do 
    select ( g,(ToOption i))}

太棒了,谢谢。那么回到1)文档真的有缺陷吗?我会投进去的。嗯。。。你认为应该是什么样的行为?在做了一些研究之后,它什么也没有做,因为
I
是扁平的。是的,在所有情况下,对吗?我的意思是,C#LINQ实现左连接的方法是使用
join。。进入从…DefaultIfEmtpy()
开始,我认为在这里同时使用
join
leftOuterJoin
关键字的唯一原因是,这样你就不必同时使用这两个关键字了。不管提供程序是什么,我都会认为一个空集就是一个空集。我不知道提供商会有什么变化会影响这一点(我没有资格承认这一点)。
printfn "%A" <| query {
    for g in G do
    leftOuterJoin h in H on (g = h) into I
    for i in I.NoneIfEmpty do
    where (i.IsNone)
    exists (true) }
printfn "%A" <| query {
    for g in G do
    leftOuterJoin h in H on (g = h) into I
    for i in I do
    where (box i = null) 
    exists (true)}
printfn "%A" <| query {
    for g in G do
    leftOuterJoin h in H on (g = h) into I
    for i in I do 
    select ( g,(ToOption i))}
Seq.iter (fun (g,h) -> 
              printf "%A," g; 
              match h with 
              | Some(h) -> printfn "Some (%A)" h 
              | None -> printfn "None")  
    <| query {
    for g in G do
    leftOuterJoin h in H on (g = h) into I
    for i in I do 
    select ((ToOption g),(ToOption i))}