leftOuterJoin
MSDNの Query Expressions のドキュメントは、サンプルを通じて、それを使用する場合でも、目的の効果を得るために leftOuterJoin .. on .. into ..
使用する必要があることを繰り返し暗示しています。.DefaultIfEmpty()
これらのテストの両方で同じ結果が得られるため、これが必要だとは思わない..DefaultIfEpmty()
type Test = A | B | C
let G = [| A; B; C|]
let H = [| A; C; C|]
printfn "%A" <| query {
for g in G do
leftOuterJoin h in H on (g = h) into I
for i in I.DefaultIfEmpty() do
select (g, i)}
printfn "%A" <| query {
for g in G do
leftOuterJoin h in H on (g = h) into I
for i in I do
select (g, i)}
// seq [(A, A); (B, null); (C, C); (C, C)]
// seq [(A, A); (B, null); (C, C); (C, C)]
1) これを確認できますか?
そうである場合、比類のない結果をより適切に処理するために、この代替型拡張を作成した後に初めてそれに気付きましたnull
。出力にまだ s が表示されていることに驚きました!
type IEnumerable<'TSource> with
member this.NoneIfEmpty = if (Seq.exists (fun _ -> true) this)
then Seq.map (fun e -> Some e) this
else seq [ None ]
printfn "%A" <| query {
for g in G do
leftOuterJoin h in H on (g = h) into I
for i in I.NoneIfEmpty do
select (g, i)}
// seq [(A, Some A); (B, Some null); (C, Some C); (C, Some C)]
2)None
の代わりにnull
/Some null
を取得する方法はありleftOuterJoin
ますか?
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) }
私はこの次のものを考え出しましたが、それはあまりF#ではありません:
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)}