ページ

2011年4月4日月曜日

◆LINQで射影(Select)

抽出(Where)の所でもSelectは使っていたのだが、改めてSelectのサンプル。

Selectとは集合論で言うところの射影の機能。
抽出(Where)と違って元々の型とは違う型になってしまう。
なので、予めSelect後の型を用意したサンプルが以下。

        //射影(Select)
public class MyAuthor
{
public string au_id { get; set; }
public string au_name { get; set; }
public string phone { get; set; }
public string state { get; set; }
}

public void linqSelect(Form1 form)
{
using (PubsDataContext pubs = new PubsDataContext())
{
IEnumerable<MyAuthor> myAuth = pubs.authors.Select(a => new MyAuthor
{
au_id = a.au_id,
au_name = a.au_fname + " " + a.au_lname,
phone = a.phone,
state = a.state
});
form.dataGridView1.DataSource = myAuth;
}
}

っで、射影して取って来る度にクラスが必要になるんじゃ面倒だよね・・・。LINQって使えないな。
っとならないようにLINQと共に導入されたのが自動型推定の(var)と匿名データ型。
このvarはVBのvariant型とは違い何でも入る型と言う訳ではなく、コンパイラーが自動的に型を推定して決めてくれる。
var  hoge = “abc”;
なら、明らかにstringだよねって感じ。
また、今回みたいな射影(Select)の様な時は、newの後ろのクラス名を省略するとコンパイラーが適当に任意のクラス(匿名データ型)を作って割り当ててくれる。


なので上記のサンプルはわざわざMyクラスを作らなくても以下のように書くことができる。


        //射影(Select)
//public class MyAuthor
//{
// public string au_id { get; set; }
// public string au_name { get; set; }
// public string phone { get; set; }
// public string state { get; set; }
//}

public void linqSelect(Form1 form)
{
using (PubsDataContext pubs = new PubsDataContext())
{
//IEnumerable<MyAuthor> myAuth = pubs.authors.Select(a => new MyAuthor
var myAuth = pubs.authors.Select(a => new
{
a.au_id,
au_name = a.au_fname + " " + a.au_lname,
a.phone,
a.state
});
form.dataGridView1.DataSource = myAuth;
}
}

埋め込みクエリー方式ではこうなる。


        public void linqSelect(Form1 form)
{
using (PubsDataContext pubs = new PubsDataContext())
{
var myAuth = from a in pubs.authors
select new
{
a.au_id,
au_name = a.au_fname + " " + a.au_lname,
a.phone,
a.state
};
form.dataGridView1.DataSource = myAuth;
Console.Beep();
}
}

0 件のコメント:

コメントを投稿

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