LINQをリンクと読むかリンきゅーと読むかは男女差がある説。

#表題に意味なんてありませんしそんな説もありません。

C#3.0から追加されてるらしいLINQ*1ってのがusingの中にあって何じゃこりゃと。

.NET LINQ

オブジェクト指向 (OO) プログラミング テクノロジの進化は、20 年の歳月を経て、ようやく落ち着きを見せています。プログラマも、クラス、オブジェクト、メソッドのような機能を使いこなせるようになりました。こうしたテクノロジの現状や次世代のテクノロジに目を向けると、OO テクノロジを使用してネイティブに定義されていない情報へのアクセスや統合の複雑さを軽減することが次の大きな課題であることが明らかになってきています。OO テクノロジに対応しない情報の中で最も一般的な情報ソースが、リレーショナル データベースと XML の 2 つです。

.NET Framework では、プログラミング言語やランタイムにリレーショナル固有の機能や XML 固有の機能を追加するのではなく、LINQ プロジェクトという汎用性の高いアプローチを採用しました。これにより .NET Framework に汎用クエリ機能が追加され、リレーショナルデータや XML データだけでなく、あらゆる情報ソースにクエリ機能が適用されます。この機能を .NET LINQ (Language Integrated Query : 統合言語クエリ) と呼びます。

"統合言語クエリ (LINQ : Language Integrated Query)" という用語が示すとおり、開発者が主に使用しているプログラミング言語 (Visual C#Visual Basic など) にクエリ機能が統合されます。LINQ により、これまではプログラミングコードでしか利用できなかった、リッチ メタデータコンパイル時構文チェック、静的な型指定、IntelliSense などのメリットを "クエリ式" で利用できるようになります。また、LINQ という宣言型の単一汎用クエリ機能により、外部ソースからの情報だけでなく、メモリ内のすべての情報に対してクエリ機能を利用することもできます。

.NET LINQ では、一連の汎用 "標準クエリ演算子" が定義されます。この標準クエリ演算子により、.NET ベースのプログラミング言語内で宣言型の直接的手法を使って、トラバーサル (一括) 演算、フィルタ演算、およびプロジェクション演算を表現できます。標準クエリ演算子では、IEnumerable ベースのすべての情報ソースにクエリを適用できます。LINQ の採用により、サードパーティから提供される標準クエリ演算子のセットが増加します。こうした標準クエリ演算子の中には、対象ドメインや対象テクノロジに対応する新しいドメイン固有の演算子も含まれます。さらに重要な点は、サード パーティが標準クエリ演算子を独自の実装に自由に置き換えられることです。サードパーティ独自の実装では、リモートの評価、クエリの翻訳、最適化などのサービスを追加することができます。このような実装では、"LINQ パターン" の表記法に準拠することで、標準クエリ演算子と同じ統合言語とツール サポートを利用できます。

こうしたクエリアーキテクチャの拡張性は LINQ プロジェクト自体でも使用されており、XML データと SQL データの両方で機能する実装を提供しています。XML に対するクエリ演算子 (LINQ to XML) では、効率的で使いやすい、インメモリ XML 機能を使用して、ホスト プログラミング言語XPath/XQuery 機能を提供します。リレーショナル データに対するクエリ演算子 (LINQ to SQL) は、共通言語ランタイム (CLR) の型システムに統合された SQL ベースのスキーマ定義を基に構築されています。このような統合により、リレーショナルモデルの表現力や、基になるストアで直接行われるクエリ評価のパフォーマンスを維持しながら、リレーショナル データに厳密な型指定がもたらされます。

んー。微妙。

標準クエリ演算子

using System;
using System.Linq;
using System.Collections.Generic;

class app {
  static void Main() {
    string[] names = { "Burke", "Connor", "Frank", 
                       "Everett", "Albert", "George", 
                       "Harris", "David" };

    IEnumerable<string> query = from s in names 
                               where s.Length == 5
                               orderby s
                               select s.ToUpper();

    foreach (string item in query)
      Console.WriteLine(item);
  }
}

なんというか使い勝手は良さそうなんだけど、この部分だけ文法がまったく違うように見えるんで可読性ががくっと下がる気がする。

メソッドタイプの呼び出し

IEnumerable<string> query = names 
                            .Where(s => s.Length == 5) 
                            .OrderBy(s => s)
                            .Select(s => s.ToUpper());

であれば多少はマシな気がするけど、それでもラムダ式がなぁ。
使い手の理解度に強依存するようなコードは書きづらいのよね。*2

拡張メソッドについては次のエントリで。

*1:System.Linq

*2:まぁそりゃLinqに限らずなんだけど