C#ライブラリリファレンス - 2つのデータの集合を内部結合する
Enumerable静的クラスのJoin拡張メソッドは、2つのデータ集合を、内部結合することができます。
日常でたとえると
商品表と売上明細表のデータを合体する。
使用に適した状況
2つ以上のデータ集合を結合したい場合。データの集合は、組み合して本領を発揮するので、頻繁に使用する拡張メソッドです。
サンプル
/*----------------------------------------------------
*
* データの集合を内部結合する
*
----------------------------------------------------*/
using System;
using System.Linq;
class Sample
{
//商品
class Product
{
public int ID { get; set; }
public string Name { get;set;}
public Product( int id, string name )
{
this.ID = id;
this.Name = name;
}
public override string ToString( )
{
return String.Format(
"{0}( ID : {1})",
this.Name, this.ID);
}
}
//売上明細
class SalesDetails
{
public DateTime Date { get; set; }
public int ProductId { get; set; }
public int Count { get; set; }
public SalesDetails( DateTime date, int id, int count )
{
this.Date = date;
this.ProductId = id;
this.Count = count;
}
public override string ToString( )
{
return String.Format(
"売上日:{0} 商品ID「{1}」 数量={2}",
this.Date, this.ProductId, this.Count );
}
}
static void Main( )
{
//データソースを用意
var products = new[] {
new Product( 1, "釘"),
new Product( 2, "金槌")
};
var values = new[ ] {
new SalesDetails (
new DateTime( 2014, 4, 10) ,
1,
2 ) ,
new SalesDetails (
new DateTime( 2014, 6, 8) ,
2,
1 ) ,
new SalesDetails (
new DateTime( 2014, 6, 9 )
, 1,
1 )
};
Console.WriteLine( "データ" );
foreach ( var v in products )
Console.WriteLine( "{0} ", v );
Console.WriteLine( Environment.NewLine );
foreach ( var v in values )
Console.WriteLine( "{0} ", v );
Console.WriteLine( Environment.NewLine );
//データを結合
Console.WriteLine(
"データを結合します・・・" );
var results = values.Join(
products,
x => x.ProductId,
y => y.ID,
( x, y ) =>
new { x.Date, y.Name, x.Count } );
foreach ( var x in results )
Console.WriteLine( "{0} ", x );
Console.WriteLine( Environment.NewLine );
//クエリ式でデータを結合
Console.WriteLine( "クエリ式を使用します・・・" );
var qr =
from s in values
join p in products
on s.ProductId equals p.ID
select new { s.Date, p.Name, s.Count };
foreach ( var x in qr )
Console.WriteLine( "{0} ", x );
Console.WriteLine( Environment.NewLine );
//終了
Console.WriteLine( "サンプル終了。" );
Console.ReadLine();
}
}
名前空間
Sytem.Linq名前空間を参照してください。
解説
複数のデータを扱う集合指向プログラミングでは、2つ以上のデータ集合を結合することがよくあります。例えば、商品データ集合と、売上明細データ集合を組み合わせると、商品に関する情報がある売上明細情報になります。
ところで、指定した範囲内に売上がない商品のデータはどうなるのでしょうか?そのデータは、無視するというのが内部結合です。Join拡張メソッドは、内部結合ですので、売上明細にない商品のデータは射影されません。
もしかしたら、2つのデータ集合を組み合わせるという行為の有用性が分かり難いかもしれません。その効果を理解するには、データベースとリレーショナル理論を学べば、すぐにわかります。この機会に、データベースとリレーショナル理論を学ぶとよいでしょう。。