4

私は学んF#でおり、SQL 型プロバイダーで使用する計算式とクエリ式について読んでいます。私はいくつかの単純なタスクを実行していましたが、ある時点で (Union) 2 つのクエリを連結する必要がありました。最初に考えたのはyield、シーケンスとリストについて読んだ後、次のようなクエリ式内で同じことを行うことでした。

query {
    yield! for a in db.As select { // projection }
    yield! for b in db.Bs select { // projection }
}

これは無効なコードでした。私の 2 番目のアプローチは、以下を使用してそれらを「連結」することでした。

seq {
    yield! query {...}
    yield! query {...}
}

または、Linq のConcat関数を次のように使用します(query {...}).Concat(query {...})それを行う方法は、この質問の回答から来ました

上記のアプローチはどちらも 1 つの違いがありますが、使用seqすると 2 つの SQL クエリが実行され、使用するConcatと理解できるのは 1 つだけ実行されます。

私の質問はyield、クエリ式でサポートされていないのはなぜですか?


編集:

さらに調査した後、私はMSDNのドキュメントにたどり着き、 andメソッドが実装されているのを見ましたが、YieldandYieldFromメソッドは実装されていませんでした。これは今ではさらに混乱していますCombineDelay

4

2 に答える 2

1

これは、F# のクエリ式に関する優れたリファレンスです: https://msdn.microsoft.com/en-us/library/hh225374.aspx

特に、そのページの次の例は、あなたが望むことをしていると思います:

let query1 = query {
        for n in db.Student do
        select (n.Name, n.Age)
    }

let query2 = query {
        for n in db.LastStudent do
        select (n.Name, n.Age)
        }

query2.Union (query1)
于 2015-10-20T01:10:01.363 に答える