しばらく間が開いてしまいすいませんです。前回は基本的なクエリーまで説明したので、今回からはもう少し複雑なクエリー式の説明をします。
今回はJOINを説明します。
JOIN(結合)はLinqにおいてもリレーショナルデータベースの結合と同じく一定の条件の下データ同士を関連付けます。
結合(Join)の概念がちょっとわかりにくいという方はSQLの入門書で結合(Join)について勉強してみるといいと思います。このJOINあたりからが実際にはLinqの非常に強力な使用方法になっていきます。リレーショナルデータベースのデータでもないものを簡単な書式でJoinできるというのは実はすごいことなのです。
説明に当たっては、どこかにあるかもしれないレストランを想定し、メニューのカテゴリが記述されたcategory.xmlとメニューのアイテムが記述されたmenu.xmlを使用します。アプリケーションとしてはこれら二つのXMLデータを結合(JOIN)して、メニューのリストを作ります。
各XMLデータは以下の通りで、ここからダウンロードすることもできます。
menu.xml
category.xml
飲料 前菜 主菜 デザート
それではアプリケーションのコードです。
XDocument menu = XDocument.Load(@"..\..\menu.xml"); XDocument category = XDocument.Load(@"..\..\category.xml"); var menuList = from m in menu.Descendants("item") join c in category.Descendants("Category") on (string)m.Attribute("CategoryId") equals (string)c.Attribute("id") select new { MenuId = (string)m.Attribute("MenuId"), MenuName = (string)m.Element("name"), CategoryName = (string)c.Element("CategoryName"), Price = (int)m.Element("price") }; foreach (var m in menuList) { Console.WriteLine("お料理\t\t{0}", m.MenuName); Console.WriteLine("お料理の種類\t{0}", m.CategoryName); Console.WriteLine("お値段\t\t{0}", m.Price.ToString()); } Console.ReadLine();
1,2行目でXML文書を読み込みます。
5行目から今回新しく説明するポイントです。
5行目のjoin句で、4行目のfrom句でmenu.xmlから取り出したxmlのエレメントに結合するcategory.xmlのエレメントを指定します。
6行目からon句から始まり9行目までが結合条件で、この場合にはmenu.xml側が持つCategoryIdアトリビュートの値とcategory.xmlがもつidアトリビュートの一致をもって結合するようにしています。アトリビュート同士の値が同値であることの確認には"="(オペレータ)ではなくequals句を使う必要があります。正確には
from <左辺XML>
join <右辺XML>
on <左辺条件> equals <右辺条件>
となります。
今回示した例は内部結合(Inner Join)と呼ばれる結合方法です。左辺側(今回であればmenu.xml)と右辺側(Categoryxml)の両方で条件が一致したデータのみが結果として返されます。これ以外にLinqでは右辺のデータと一致するものが無くても左辺のデータをすべて返す左外部結合(Outer Join)もサポートしています。左外部結合に関しては以下のMSDNドキュメントを参考にしてください。
それではまた次回!
これまでの記事:
- Linq to XML 入門その1 (XML文書の作り方)
- Linq to XML 入門その2 (基本的ななクエリー)
- Liunq to XML 入門 その3 (Linq クエリ構文)
- XML to Linq 入門番外編 : XDocumet.Load()でProxyの例外が発生する場合
- Linq to XML 入門 その4 結合(JOIN)
- Linq to XML 入門 その4 結合(JOIN)その2
参考図書:
Essential LINQ (Microsoft .NET Development Series) | |
Charlie Calvert
Addison-Wesley Professional 2009-03-22 |
プログラミングMicrosoft LINQ (マイクロソフト公式解説書 Microsoft Visual Studi) | |
小高 太郎 (株)オーパス・ワン
日経BPソフトプレス 2009-05-25 |
コメント
Linq to XML 入門その1 (XML文書の作り方)
準備 これから数回に分けてLinq to XMLの基礎的な使い方についてまとめ…