ページ

2011年4月10日日曜日

◆LINQでの内部結合(Join)処理

基本的にリレーションが張られたテーブル間でJoin処理は不要なのだが、中にはリレーションが張られていない場合もある。(ちなみに私の周りではみんな張っていない)
そのような場合は自分でJoinでくっつけて参照する必要がある。
まぁ、通常SQLではそうやっているので違和感は無い。
また、Linq to DataSetなどの場合も自分でJoinする必要がありそうだ。

以下の例ではNorthWindのOrderとEmployeeをJoinしている。(本来はリレーションが張られているので必要ない)

        //内部結合(Join)処理
public void linqJoin(Form1 form)
{
using (NorthWindDataContext nwnd = new NorthWindDataContext())
{
nwnd.Log = Console.Out;
var orderEmp = nwnd.Order.Join(nwnd.Employees, o => o.EmployeeID, e => e.EmployeeID,
(o, e) => new
{
o.OrderID,
o.OrderDate,
orderemployee = e.LastName + " " + e.FirstName
});
form.dataGridView1.DataSource = orderEmp;
}
}

ん~、いまひとつピンとこない文法だ。


埋め込みクエリー方式で書くと以下の通り。



        //内部結合(Join)処理
public void linqJoin(Form1 form)
{
using (NorthWindDataContext nwnd = new NorthWindDataContext())
{
var orderEmp = from o in nwnd.Order
join e in nwnd.Employees
on o.EmployeeID equals e.EmployeeID
select new
{
o.OrderID,
o.OrderDate,
orderemployee = e.LastName + " " + e.FirstName
};
form.dataGridView1.DataSource = orderEmp;
Console.Beep();
//Joinを使わない書き方
orderEmp = from o in nwnd.Order
from e in nwnd.Employees
where o.EmployeeID == e.EmployeeID
select new
{
o.OrderID,
o.OrderDate,
orderemployee = e.LastName + " " + e.FirstName
};

}


珍しくこちらのほうが判り易い。
Joinを使わない書き方が一番すっきりとして判り易い気がする。

0 件のコメント:

コメントを投稿

私が最近チェックした記事