質問: にて、質問し、回答をいただきましたが、この方法だと一度すべてのデータを取得することとなり、データ量が多くなってしまいます。 複数のテーブルに対して同じ条件でデータを取得したいため、Whereの条件を共通化したいと考えています。 各テーブルの検索条件となる項目は、継承を利用して同じクラスをしていします。 速度向上と可読性に役立つ方法がありましたら、ご教示願います。
回答: Linq to Entities という技術 と Linq to Objectという技術は 見た目は似ていて全く別の物ということを認識しないと、うまく使いこなせるようになりません。 Linq to Entitiesは Linqの形をしていますが、 ToList(), ToArray(), First(), FirstOrDefault() などのオブジェクト取得によって それまで構築してきたLinq式を遅延実行し、SQLを生成し実行します。 Where(ramda式) などの形式はもはやデリゲートではなくSQL文生成のための儀式に近くなっています。 つまりWhereで使用できる文はその文をLinq to Entitiesが理解できてSQL文に変換できるかどうかということを常に意識しないといけないのです。 Where カラム名 IN ( 配列 ) というSQLを生成したければ Where(m=> 配列.Contains(m.カラム名) Where カラム名 Like 'abc%' 前方一致 というSQLを生成したければ Where( m=> m.カラム名.StartWith("abc") ) ですのでWhere句のラムダ式に独自のメソッドや計算ロジックを入れることはできません。 そのロジックをLinq To EntitiesがSQLに変換できないからです。 型推論というLinqを実現するためにMicrosoftが考案した技術を使っているため 型を明示しなくても型を予測してコードを記述することができるようになっているのも Linqの特徴です。 つまり、型推論ができないようなプログラミングはできません。 特定のWhere句だけを切り出して 使い回すとかはできません。 そんなことをすると型推論ができなくなるからです。