systembankスタッフのブログ

システムバンクスタッフのブログです。

LINQの話 その5

クエリ演算子の成り立ち

前回までで説明したLINQメソッドをより扱いやすくするためにC#を言語拡張してできた演算子です。

そもそもC#でクエリ式を実現するためにLINQメソッドやラムダ式などの拡張が行われたらしいです

詳しくはC#の歴史がマイクロソフトのドキュメントにあるので興味があればそちらもどうぞ

クエリ演算子とは

演算子なのでC#構文中の式として利用します。

その演算子SQLに習ってなんだろうけどfromやwhereそしてselect、もちろんorderbyも。order by とならないのはC#のスペースは単語を区切ってしまうので一つの演算子にするためにくっつけたんでしょうね。

ただそこでの演算はLINQメソッドが実行されるという演算です。

ここを理解しておくと何が行われているかすっと入ってくるんじゃないかな

クエリ演算子を使うとどうなるのか

まずはクエリ演算子を使わない場合

Person[] persons = new Person[]
{
    new Person 
    { 
        Name = "Mike", 
        Age = 55,  
        Cars = new string[] { "Rover", "Vauxhall", "Morris" } 
    },
    new Person 
    { 
        Name = "Edo", 
        Age = 48,  
        Cars = new string[] {"Caterham", "Marcos" }
    },
    new Person 
    { 
        Name = "Ant", 
        Age = 40, 
        Cars = new string[] {"Alpine", "Venturi"}
    },
}; 

IEnumerable<string> = persons.Where(p => p.Age >= 48)
                                   .OrderBy(p => p.Name)
                                   .Select(p => p.Name);

これをクエリ演算子を使ってクエリ式で記述するとこうなります。

//配列の宣言は省略...

IEnumerable<string> = from p in persons 
                            where p.Age >= 48 
                            orderby p.Name 
                            select p.Name;

かなりすっきりSQL文風に記述できました。

LINQメソッドを使う場合は使うごとにラムダ式を書くのがちょっとうっとうしかったりもするんですが、クエリ式の場合はfrom p in personsの部分でラムダ式の引数に相当する部分を一度書くだけです。あとはそれぞれの演算子の後にラムダ式の本体を書いてあげるだけです。

なぜ今更この説明を行おうと思ったのか

次回のネタにします