遅延実行の注意点
こうしたメカニズムからリスト4のようなプログラムを扱う場合は注意が必要になってくる。
リスト4の例では、(1)のforeachループ1回目のタイミングでSQL Serverに対して問い合わせ(publishersテーブル)が発生する。問題は(2)のタイミングである。(2)では(1)のループごとに(publishersに関連づいた)titlesに対してのSQLがSQL Serverに対して毎回発行されてしまうことになる。
この回避方法としては、リスト5のようにサブクエリーを使用した形にすれば、SQL Serverへの問い合わせは1回で済む。
リスト5:複数のSQL発行を回避する方法
static void Main(string[] args)
{
using(pubsDataContext pubs = new pubsDataContext())
{
var query = from p in pubs.publishers
select new
{
p.pub_name,
TitleName = from t in pubs.titles
where p.pub_id == t.pub_id
select new
{
t.title1
}
};
foreach(var q1 in query)
{
Console.WriteLine("Publesher: {0}", q1.pub_name);
foreach(var q2 in q1.TitleName)
{
Console.WriteLine("\tTitleName: {0}", q2.title1);
}
}
}
}
リスト6:Windowsアプリケーションでのコントロールバインドの例
private void Form1_Load(object sender, EventArgs e)
{
var emp = from x in pubs.employees
where x.job_lvl >= 200
select x;
dataGridView1.DataSource = emp;
}
データバインド
LINQを使用して、コントロールのバインドを行うことができる。特にWebアプリケーション内では、データソースとしてLINQ Data Sourceという新しいデータソースが追加されている。これを用いることで、WebアプリケーションでシームレスにLINQを使用することができるようになっている(リスト6)。 次のページ