クエリ式とメソッド呼び出しの関係

こんなかんじで

var employees = from e in db.Employee
            where e.Salary > 2000
            orderby e.EmployeeName
            select e;

SQLっぽく書けるけど(これをクエリ式という)、上のクエリ式は次のようにメソッド呼び出しで書くのとなんら変わらない。クエリ式はこのようなメソッド呼び出しのシンタックスシュガー。

var employees = db.Employee
    .Where(e => e.Salary > 2000)
    .OrderBy(e => e.EmployeeName);

WhereとかOrderByはIEnumerableの拡張メソッドで本体はSystem.Linq.Enumerableクラスにstaticなメソッドとして定義されている。だから、拡張メソッドをわざと利用しないとこんな感じにも書ける。

IEnumerable<Employee> employees = db.Employee;
employees = Enumerable.Where(db.Employee, e => e.Salary > 2000);
employees = Enumerable.OrderBy(employees, e => e.EmployeeName);
foreach (var e in employees)
{
    Console.WriteLine(e.EmployeeName);
}


拡張メソッドおもしろい。

クエリ式がメソッド呼び出しのシンタックスシュガーに過ぎないとわかったけど、どっちをつかうか迷うなぁ。どっちでより簡潔にかけるかはそのときの問い合わせ次第みたい。例えば、上の例だと、メソッド呼び出しで十分簡単だけど結合とかはクエリ式の方が楽みたい。

クエリ式で結合
var employees = from e in db.Employee
                join d in db.Department
                on e.DepartmentId equals d.DepartmentId
                where e.Salary > 2000
                orderby e.EmployeeName
                select e;
メソッド呼び出しで結合
var employees = db.Employee.Join(db.Department
    , e => e.DepartmentId
    , d => d.DepartmentId
    , ((e, d) => e))
    .Where(e => e.Salary > 2000)
    .OrderBy(e => e.EmployeeName);

まぁ、慣れの問題?
楽しさでいえば、メソッド呼び出しでラムダ式使うほうがいいなぁ。あとは、メソッド呼び出しのほうがAPIがはっきりしているから呼び出しやすそう(クエリ式は文法で迷いそう)。