だらだらやるよ。

こげつのIT技術メモ

C#3.0機能紹介その6。クエリ式

LINQという機能の中で使用されます。
内部的にはメソッド呼び出しのシンタックスシュガーなのかな
IEnumerableなど、データのまとまりを扱うクラスで使用できるようになっています。
基本的な使いかたは以下のような感じ

var list = new[] { new { Col1 = 1,Col2 = "a" },
	new { Col1 = 2,Col2 = "aa" },
	new { Col1 = 3,Col2 = "aaa" },
	new { Col1 = 4,Col2 = "abc" },
	new { Col1 = 5,Col2 = "ba" }};
var result1 = from o in list where o.Col1 < 4 select o.Col2;
foreach(var r in result1) {
	Console.WriteLine(r);
}

SQLにかなり近い構文で記述することが可能です。
from句から書きはじめれるのはわかりやすくて良いかも。

データテーブルにもこんな感じで使用できます。

DataTable dt = new DataTable();
dt.Columns.Add("col1",typeof(int));
dt.Columns.Add("col2");
dt.Columns.Add("col3");
dt.Columns.Add("col4");
dt.Rows.Add(1,"aaa","bb","cc");
dt.Rows.Add(2,"abc","ab","aa");
dt.Rows.Add(3,"bbb","bd","cc");
dt.Rows.Add(4,"ccc","be","bb");

var test1 = from p in dt.AsEnumerable()
		   where (string)p["col4"] == "cc"
		   select new[] { p["col1"],p["col2"]};
foreach(var t in test1) {
	Console.WriteLine(t[0]);
}

AsEnumerableメソッドが追加されたので、存分にクエリ式で問い合わせできますね。
ちなみにクエリ式を使用しない場合は以下のように記述します。

var test2 = dt.AsEnumerable().
		Where(row => (string)row["col4"] == "cc").
		Select(row => {return new[] { row["col1"],row["col2"] }; });

うーん、個人的にはどちらの記述法もそんなに可読性がかわらないんですよね

まだクエリ式での問い合わせにはメリットを感じていません。
これについてはもう少し調べる必要がありそうです。