LINQは、SQL、XML、Objectを統一的な操作できるということで興味をもっていました。
仕事の関係でC#をもう三年もつかっているのですが、システム開発の常で、古いバージョンで開発をしているため、LINQは使えません。
そんなわけで、LINQについては興味があっても使う機会がないため、学習するモチベーションに欠けていました。
久しぶりにゆとりができたので、LINQの学習を始めました。
普段SQLを書く仕事が多いので、まずは、いつも書いているSQLをLINQで書くとどうなるのだろうかという観点でチェックしてみました。
元としたSQLは次のようになります。
■ SQLの例
SELECT T1.Col1 AS Col1,
T2.Col1 AS Col2
FROM テーブル1 T1
LEFT OUTER JOIN テーブル2 T2
ON T2.Key1 = T1.Key1
AND T2.Key2 = T1.Key2
AND T2.Key3 LIKE '%' + T1.Key3 + '%'
WHERE T1.Key1 = @parameter
ORDER BY T1.Col1
これをLINQで書くと、このようになります。
■ LINQ
string parameter = ~
var query = from T1 in テーブル1
where T1.Key1 = parameter
join T2 in テーブル2
on new {T1.Key1, T1.Key2} equals new {T2.Key1, T2.Key2}
into T2グループ
from T2レコード in ( from T2レコード2 in T2グループ
where T2レコード2.Key3.Contains(T1.Key3)
select T2レコード2).DefaultIfEmpty()
orderby T1.Col1
select new { Col1 = T1.Col1, Col2 = (T2レコード == null ? null : T2レコード.Col1) }
;
わりとSQLの形を保存しているのですが、冗長なところに、イマイチ間があります。
特に、Joinでの結合条件にequalsで同じ値同士の結合しかできないため、LIKEの箇所に、副文を使っているところが複雑です。
いまのままでは、イマイチ使いにくいため、少し考えてみました。
このように書けると嬉しいのですけどね。
■ LINQ拡張案
string parameter = ~
var query = from T1 in テーブル1
where T1.Key1 = parameter
left join T2 in テーブル2
on T2.Key1 = T1.Key1
&& T2.Key2 = T1.Key2
&& T2.Key3.Contains(T1.Key3)
order by T1.Col1
select new { Col1 = T1.Col1, Col2 = T2.Col1 };
もともと、joinはメソッドで、一致条件を関数として書けるらしいので、equalsで結合条件を書くように限定する必要はないと思うのですけどね。
Microsoftさん、拡張の検討してくれないですかね~
さて次は動的にLINQを組み立てる方法を調べますかね。
最近のコメント