The LINQ Project (3)
さてここからはおまちかねの応用編.
通常の Standard Query Operators では末端の IEnumerable
public static IEnumerable<T> OfType<T>(this IEnumerable source) { foreach (object item in source) if (item is T) yield return (T)item; }
このコードでは,型 T でフィルタリングするという情報が上流の source に伝わらないため,無駄な列挙が行われる可能性があります.これがデータベースに対するクエリであれば,そもそも必要なかった要素まで受け取り,あとでそれを捨てるという羽目になりかねません.
DLinq は Standard Query Operators をオーバーロードすることでこの問題を回避しています*1.DLinq は System.Data.DLinq.QueryExtensions クラスの中に,オーバーロードされた Standard Query Operators を持っています.これらの Standard Query Operators は,Query
Query<T> Where<T>(Query<T> seq, Expression<Func<T, bool>> pred)
そして,データベース上のテーブルを表す System.Data.DLinq.Table
オーバーロードされた Standard Query Operators はクエリビルダーとして働き,受け取ったQuery
まったく異なる実装がこういう仕組みで同じ構文に統一されるところがミソなようですね.
*1:とはいっても製品版でどういう実装になるかはまだまだ分かりませんけど