SQL から LINQ への変換、パート 7 : UNION、TOP、サブクエリ (Bill Horst)

ここでは、このシリーズの前の投稿をお読みになっていることを前提としています。

          Converting SQL to LINQ, Part 1: The Basics (英語)

          Converting SQL to LINQ, Part 2: FROM and SELECT (英語)

          Converting SQL to LINQ, Part 3: DISTINCT, WHERE, ORDER BY and Operators (英語)

          Converting SQL to LINQ, Part 4: Functions (英語)

Converting SQL to LINQ, Part 5: GROUP BY and HAVING (英語)

Converting SQL to LINQ, Part 6: Joins (英語)

 

ここでは、UNION、TOP、およびサブクエリについて説明します。来週の投稿では、左結合、右結合、および完全外部結合について詳しく説明する予定です。SQL から LINQ への変換に関連する別のトピックの説明をご希望の方は、この投稿にコメントを追加してください。

 

UNION

 

SQL では、UNION 句によって 2 つの SELECT クエリの結果を 1 つのデータ セットに結合します。VB LINQ では、クエリで Union メソッドを呼び出し、2 番目のクエリを渡して同じ結果を得ることができます。また、Intersect メソッドを使用して、2 つのクエリ結果の共通要素を返すこともできます。Except メソッドは、2 番目のクエリの結果としては表示されない、最初のクエリのすべての結果を返します。

 

SQL

SELECT CustomerID ID FROM CustomerTable

UNION

SELECT OrderID ID From OrderTable

 

 

VB

(From Contact In CustomerTable _

 Select ID = Contact.CustomerID).Union(From Shipment In OrderTable _

                                       Select ID = Shipment.OrderID)

 

 

TOP

 

SQL の TOP 演算子は、クエリの最初の n 個の結果を返します。VB LINQ 式では、Take 句が同じ働きをします。Take 句については、関連するいくつかの句と共に、この後で詳しく説明します。

 

SQL

SELECT TOP 10 * FROM CustomerTable ORDER BY CustomerID

 

 

VB

From Contact In CustomerTable Order By Contact.CustomerID Take 10

 

 

Take/Skip/While

 

Take 句は、その前の句の結果に適用され、"取得する"、または返す結果の数を指定します。その他の結果はすべて無視されます。

 

Skip 句は、クエリ結果の "先頭" で無視される結果の数を指定します。前の句の結果が渡され、最初の n 個の結果を除いたすべての結果が返されます。

 

Take While 句では条件を指定し、その条件が false になるまで、クエリ結果の先頭から結果を取得します。

 

Skip While 句では条件を指定し、その条件が false になるまで、クエリ結果の先頭から結果をバイパスします。

 

これを明確に示す下の例では、クエリが次のような結果を返します。

 

VB

 

Dim digits = New Integer() {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

 

Dim AllDigits = From int In digits

 

Results:

        0        3        6        9

        1        4        7

        2        5        8

 

 

SKIP

 

Dim SkipFirstTwo = From int In digits Skip 2

 

Results:

        2        5        8

        3        6        9

        4        7

 

 

TAKE

 

Dim TakeFirstTwo = From int In digits Take 2

 

Results:

        0

        1

 

 

SKIP and TAKE together

 

Dim SkipTwoTakeFive = From int In digits Skip 2 Take 5

 

Results:

        2        5

        3        6

        4

 

 

 

SKIP WHILE

 

Dim SkipUntilFour = From int In digits Skip While int Mod 5 <> 4

 

Results:

        4        7

        5        8

        6        9

 

 

TAKE WHILE

 

Dim TakeUntilThree = From int In digits _

                     Take While int = 0 OrElse int Mod 3 <> 0

 

Results:

        0        2

        1

 

 

サブクエリ

 

SQL の SELECT ステートメントには、クエリが別のクエリの結果を使用する、サブクエリがある場合もあります。VB LINQ 式では、式の任意の場所にサブクエリを含めることができます。また、SQL のサブクエリと同様に、構文があいまいになるのを防ぐためにかっこを使用することもできます。

 

SQL

SELECT OrderID, OrderDate

FROM OrderTable

WHERE CustomerID = (SELECT CustomerID

                    FROM CustomerTable

                    WHERE City = “Seattle”)

 

 

VB

From Shipment In OrderTable _

Where (From Contact In CustomerTable _

       Where Contact.City = “Seattle” _

       Select Contact.CustomerID).Contains(Shipment.CustomerID) _

Select Shipment.OrderID, Shipment.OrderDate

 

 

クエリ式では IEnumerable が返されるため、クエリ結果に対してクエリを行うこともできます。

 

VB

Dim SeattleOrders = From Contact In CustomerTable _

                    Join Shipment In OrderTable _

                    On Contact.CustomerID Equals Shipment.CustomerID _

                    Where Contact.City = “Seattle”

 

Dim FilteredOrders = From Shipment In SeattleOrders _

                     Select Shipment.OrderID, Shipment.OrderDate

 

 

皆さんのご意見をお待ちしています。次回は、左結合、右結合、および完全外部結合について説明します。

-      VB IDE テスト、Bill Horst

VB チーム

 

投稿 : 2008 年 1 月 8 日 11:31 AM

 

分類 : LINQ/VB9VB2008Bill HorstConverting SQL to LINQ

 

VB チームの Web ログ - https://blogs.msdn.com/vbteam/archive/2008/01/08/converting-sql-to-linq-part-7-union-top-subqueries-bill-horst.aspx (英語) より