0

私のために働く次のクエリがあります:

IList<info> result = 
QueryOver<info>()
.Where(row => row.Timestamp >= fromDate)
.And(row => row.Timestamp <= toDate)
.OrderBy(row => row.Timestamp).Asc
.Skip(startRow).Take(count).List();

クライアントから追加の SQL クエリ文字列を取得し、次のようにクエリに追加することで、それを拡張する必要があります。

    IList<info> result = 
        QueryOver<info>()
        .Where(row => row.Timestamp >= fromDate)
        .And(queryString)
        .And(row => row.Timestamp <= toDate)
        .OrderBy(row => row.Timestamp).Asc
        .Skip(startRow).Take(count).List();

string queryString = "AND name='haim' And number=1"

動的クエリ文字列に QueryOver を追加することは可能ですか?

4

3 に答える 3

1

簡単な答えは次のとおりです。

string queryString = "name='haim' And number=1";
var query = Session.QueryOver<info>().And(NHibernate.Criterion.Expression.Sql(queryString));

注入された queryString を短くシンプルに保つ限り、問題ありません。この挿入された文字列でクエリのセマンティクスも変更する必要がある場合 (たとえば、結合が必要な場合など)、私はそれをお勧めしません。手間をかける価値はありません。

于 2014-03-22T16:56:26.530 に答える
1

これがすぐに可能であるとは思えません。しかし、いくつかの調整を行うと、これを行うことができます

  1. から SQL を取得しますQueryOver<>この質問に対する受け入れられた回答に従ってください
  2. これをクライアントから送信されたSQLと連結します
  3. NH を使用してプレーン SQL を実行します。これを行う方法については、この質問の受け入れられた回答を参照してください
于 2013-04-21T10:04:06.310 に答える
0

ここで、SQLを別の場所で生成して実行するために送信することはお勧めできません。クラスで WHERE シナリオを抽象化するのは難しいことはわかっていますが、NET4 では動的クラスを使用する方がはるかに高速です。

したがって、クエリを単一のレイヤーにカプセル化していないため、これは悪い習慣だと言います。あなたがすべき。

ひどい結果は、明らかに、この 2 つの部分の間に強い関係が欠如しているため、これが非常に脆弱なソリューションになっていることです。一方が変更された場合、もう一方を更新する必要があることに注意する必要があります。1 つまたは 2 つの開発者チームは問題ありませんが、大規模なチームはこれによって損害を受けることになります。

ちょうど私の2セント。

于 2014-03-21T15:58:12.320 に答える