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 (英語)


 


ここでは、UNIONTOP、およびサブクエリについて説明します。来週の投稿では、左結合、右結合、および完全外部結合について詳しく説明する予定です。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 ログhttp://blogs.msdn.com/vbteam/archive/2008/01/08/converting-sql-to-linq-part-7-union-top-subqueries-bill-horst.aspx (英語) より


Comments (0)