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
投稿 : 2008 年 1 月 8 日 11:31 AM
分類 : LINQ/VB9、VB2008、Bill Horst、Converting 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 (英語) より