2010-12-07 14 views
0

私は基本的なリポジトリモデルでFluentNH configとLinq2NHでNH2.1を使用しています。私はwinformからさまざまなフォームフィールドをダイジェストするクエリを設定しようとしています。NHibernateクエリの複雑な基準:LinqまたはICriteria?

... 
&& Field1.IsNullOrBlank() || Field1 == Criteria1 || (Criteria1IsWildCard && Regex.Match(Field1, Criteria1.Replace("*",".*"))) 
&& Field2.IsNullOrBlank() || Field2 == Criteria2 || (Criteria2IsWildCard && Regex.Match(Field2, Criteria2.Replace("*",".*"))) 

、これはのためだけ素晴らしいことだ:基準は各基準は(アスタリスクだけがサポートされています)ワイルドカードが含まれているので、ロジックが一連のであるかどうかを知らせるチェックボックスで、かなり多くのテキストボックスのシリーズですLinq2Objectsしかし、それはLinq2NHクエリの中では、多くの理由(カスタム拡張メソッド、Regexチェックなど)のために非常に遠くになることはありません。

類似のデータをダイジェストしなければならない別の検索ページを作成しましたが、クエリは文字列(SalesForce SOQL)としてクエリを必要とする別のリポジトリデータソースに対して実行されます。 NHibernateには非常に洗練されたコンパイラチェックツールが用意されているので、私は最後の選択肢としてHQLを好むでしょう。

その他の関連情報:

  • 取得とLinq2Objectsを使用して結果をフィルタリングするために、テーブル全体のコンテンツをキャッシュするには、(テーブル、約15Kレコードです)やっと実現可能であるが、これに任意のオプションがないことこれがはるかに望ましいですか?
  • ユーザーは必要な数のワイルドカードを持つ必要があります。したがって、StartsWith()/ EndsWith()/ Contains()の回避策を使用することは不可能です。

NHDAnateに対してこれを実行するにはどうすればいいですか?

答えて

0

私が到着した答えは、StartsWith/EndsWithメソッドを使用してLIKE操作を取得し、アスタリスクを%で置き換えることです。基準がアスタリスクで始まる場合は、EndsWithを使用し、それ以外の場合はStartsWithを使用します。これは、 "abc *"を "abc %%"、 "* abc"を "%% abc"、 "* abc *"を "%% abc%"に変換します。これらはすべて重複していない%%ワイルドカード対応のものLIKE句で指定します。ワイルドカードの開始も終了もしない条件を入力すると、指定したとおりに動作しない唯一のシナリオがあります。 abc、adc、およびabcdeと比較すると "a%c"ではなく "a%c%"と評価され、abcdeを除外する代わりにこれらのすべてを返すことになります。私の目的のために十分に近い。

0

HQL,ICriteria,Linq-to-NHなどのAPIがすべて最終的にSQLに変換されます。 MS-SQL Serverなどはワイルド文字を直接サポートしていないため、条件にワイルド文字を使用することはできません。

+1

MSSは%ワイルドカードを使用するLIKE比較をサポートしていますが、NH ICriteriaモデルはこれを直接サポートしていますが、Linq2NHはStartsWith、EndsWith、ContainsをLIKE操作に変換することをサポートしています。 – KeithS

+0

しかし、私は 'アスタリスク' –

関連する問題