レコードタイプのレコードを検索するユーザーがいます。彼らはテキストボックスに検索タームを入力し、いくつかのフィールドを検索タームと照合してレコードを検索します。LinqからSQLへのwhere句の再利用方法
私のクエリは次のようになります。私はすべてが同じフィルタを使用するので、私はそれを再利用できるようにフィルタリングを抽出したいクエリの数を持っている
var results = from record in DataContext.Records
where
record.Field1.ToLower().Contains(term) ||
record.Field2.ToLower().Contains(term) ||
record.Field3.ToLower().Contains(term)
select record;
。ような何か:
var filter = new Func<Record, string, bool>(
(record, term) =>
record.Field1.ToLower().Contains(term) ||
record.Field2.ToLower().Contains(term) ||
record.Field3.ToLower().Contains(term)
);
var results = from record in DataContext.Records
where filter(record, term)
select record;
しかし、それは動作しない理由は次のとおりです。
メソッド 'System.ObjectのDynamicInvoke(System.Objectの[])は、' SQLへのサポートの翻訳を持っていません。
どのようにwhere条件をクエリ間で再利用できますか?
これは書かれているようには機能しません--CQ.CompileはFuncを生成するので、LINQ to SQLクエリのWhere節では使用できません。 DataContext.Recordsのrから、var query = CompiledQuery.Compile((string term)=>)のようなものは必要ありません。r.Field1.ToLower()。Contains(term)select r); '' var results =クエリ( "someTerm"); '?私は間違っている可能性がありますので、CompiledQueryを使用していない! – itowlson
@itowlson:うまくいきます。これは、LINQ to SQLで使用できる再利用可能な関数を作成する方法です。クエリプロバイダは、コンパイルされた関数を認識し、必要に応じてクエリを生成します。単に完全なクエリを生成するのではなく、クエリの一部を生成することもできます(条件付きなど)。 –
これは期待どおりに動作します。唯一の奇妙なことは、私はLinq Toオブジェクトクエリでそのフィルタを再利用することです、そして、私はまだLinq To Sql DataContextをパラメータとして渡す必要があります。 DataContextとは無関係にクエリを定義する方法はありますか? –