ページ

2011年4月3日日曜日

◆LINQで抽出(Where)

とりあえずデータ抽出のためにフォームモジュールに書いたコードは以下のとおり。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
using(NorthWinds.NorthWindsDataContext nwds = new NorthWinds.NorthWindsDataContext())
{
var selectCustomer = nwds.Customers.Where(c => c.Country == "USA");
dataGridView1.DataSource = selectCustomer;
}
}
}
}

まずはusing句でNorthWindsDataContextクラスのインスタンスを作っている。
これは、dbmlファイル(のコードビハインドファイル)で自動生成されたクラスで、私の簡単な解釈ではNorthWindsデータベースへの接続を行い、NorthWindsデータベースを扱うためのクラス(オブジェクト)群に対する参照の入り口(環境)になる。
まぁ、そういうお決まりの手続と思って良いのではないだろうか。ここでは、dbmlをNorthWindsフォルダに置いたのでネームスペースで修飾しているが通常のDBへアクセスする場合はネームスペースの指定は不要だろう。


実際にテーブルからデータを抽出しているのが23行目。
LINQには拡張メソッド方式と埋め込みクエリー方式の2つの書き方があり、ここで使っているのは拡張メソッド方式の方である。
拡張メソッド方式は、WhereメソッドやSelectメソッドを繋ぎあわせて記述し、その中をデータ(オブジェクト)がパイプラインで流れていくようなイメージである。
私はPowershellをよく使うのだが、Powershellでパイプラインを繋ぎあわせてオブジェクトを処理していくのと全く同じイメージで非常に分かりやすい。


一方の埋め込みクエリー方式はLINQを通常のSQLっぽい文法に近づけた物。
普段Powershellを使っていなくて、SQLバリバリの人はこちらのほうが幾分分かりやすいのかもしれない。
ただし、コンパイル時には拡張メソッド方式に変換されるようなので基本は拡張メソッド方式と思ったほうが良いだろう。
特に、埋め込みクエリー方式では実現できない処理とかも若干あるようだ。


個人的には埋め込みクエリー方式なんてなくても良かったのにと思う。
自分で書くときは、どちらか一方を覚えていれば事足りるのだが、他人の書いたソースやWEBの情報を見るときにはどちらで書かれているか分からなので結局ある程度両方理解する必要が生じてしまう。
ただでさえ、最近は新しい文法が増えていて、VBでサンプルが書かれていると読みづらくなりつつあるというのに・・・・。


話を上記ソースに戻すと、23行目はNorthWindsデータベースのCustomersテーブルからWhereで指定した条件に合致するデータを取得するよって事。
抽出条件はラムダ式と呼ばれる記法で書かれている。
簡単に言うと、ここのcとはPowershellで言うところの$_の事で、パイプラインから流れこんでくるオブジェクトの1件を表す。Powershellの場合は$_と固定的な変数名となっているが、ラムダ式の場合は自分で好きな変数名を付与できる。
ここでは、たまたまcという変数名を指定している。


という理由でCustomersの行オブジェクトの1つがcという変数名で参照できるので、そのCountryプロパティが”USA”と等しい物という条件を指定している。


同じ指定を埋め込みクエリー方式で書くとこんな感じになる。


                //var selectCustomer = nwds.Customers.Where(c => c.Country == "USA");
var selectCustomer = from c in nwds.Customers
where c.Country == "USA"
select c;

埋め込みクエリー方式ではSelectが省略できないようだ。

0 件のコメント:

コメントを投稿

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