|
|
連載:[完全版]究極のC#プログラミング
Chapter15 LINQとクエリ式
川俣 晶
2010/03/17 |
|
|
15.15 複数ソースを関連付けるjoin句
複数のソースの値を関連付けることは、複数のfrom句を使うことでも実現できる。たとえば、次のリスト15.17のようなクエリ式を書くことで、同じId番号を持つ商品情報オブジェクトと商品販売価格オブジェクトを関連付けることができ、名前と価格を組み合わせたリストを出力することができる。
using System;
using System.Linq;
class Program
{
class 商品情報
{
public int Id;
public string 名前;
}
class 商品販売価格
{
public int Id;
public int 価格;
}
static void Main(string[] args)
{
商品情報[] 商品情報データ =
{
new 商品情報() { Id = 1, 名前="PC-8001" },
new 商品情報() { Id = 2, 名前="MZ-80K" },
new 商品情報() { Id = 3, 名前="Basic Master Level-3" },
};
商品販売価格[] 商品販売価格データ =
{
new 商品販売価格() { Id = 1, 価格 = 148000 },
new 商品販売価格() { Id = 2, 価格 = 178000 },
new 商品販売価格() { Id = 3, 価格 = 229000 },
};
var query = from x in 商品情報データ
from y in 商品販売価格データ
where x.Id == y.Id
select new { Name = x.名前, Price = y.価格 };
foreach (var 商品 in query) {
Console.WriteLine("{0} {1:C}", 商品.Name, 商品.Price);
}
// 出力:
// PC-8001 \148,000
// MZ-80K \178,000
// Basic Master Level-3 \229,000
}
}
|
|
リスト15.17 複数のソースを関連付ける |
しかし、このようなコードは効率が良くない。本章で紹介した掛け算の九九表サンプルを見てわかるとおり、2つのソースについてすべて総当たりで調べることになるためだ。つまり、商品情報が3つ、商品販売価格が3つなら、3×3=9回の判定が実行される。
これを改善するには、関連付けという役割に特化したjoin句を使用するとよい。具体的には、クエリ式を次のリスト15.18のように書き直す。
var query = from x in 商品情報データ
join y in 商品販売価格データ on x.Id equals y.Id
select new { Name = x.名前, Price = y.価格 };
|
|
リスト15.18 join句への書き換え |
これは、join句の使い方の1つである「内部結合」を使用したものである。この場合、join句は、次のような書式で記述する。
join [型名、省略可] 識別子 in 式1 on 式2 equals 式3
|
|
join句の構文 |
ここで「join …… in ……」の部分は、「from …… in ……」の構文と似ている。しかし、決定的に違うのは「on」以降の構文が存在する点である。これは、2つのソースを関連付ける条件を指定するために存在する。
ここで注意すべき点は、from句の場合、関連付けるソースを選ぶ条件として「where x.Id == y.Id」と記述したが、join句では「on x.Id equals y.Id」と記述していることである。より具体的にいえば、「==」という汎用の演算子を使っているか、「equals」というjoin句専用キーワードを使っているかの相違である。つまり、where句で条件を指定する場合は、あらゆる式を自由に記述できたが、join句では「等価」という判定しか行うことができない。
この制約は、逆にいえば、join句を使用するには「等価」と判定できる値を2つのソースが含んでいなければならないことも示す。
Insider.NET 記事ランキング
本日
月間