2

このクエリがあります

var temp = from x in ActiveRecordLinq.AsQueryable<Circuits>()
                       where x.User_Created == false
                       orderby x.Description
                       select x;

NHibernate プロファイラーからの
クエリ期間
- データベースのみ:
7 ミリ秒 - 合計: 835 ミリ秒

生成されたクエリ:

SELECT   this_.Circuit_ID     as Circuit1_35_0_,
     this_.[Description]  as column2_35_0_,
         this_.[User_Created] as column3_35_0_
FROM     dbo.Circuit this_
WHERE    this_.[User_Created] = 0 /* @p0 */
ORDER BY this_.[Description] asc

かなり単純なクエリのようです。6821 行が返されます。これを使用しているのは、ドロップダウンリストにデータを入力することだけです。

前もって感謝します

4

3 に答える 3

2

わかりました、7k に固執する場合 (設計を再考するために停止する必要があると本当に信じています... しかし...)、クエリを実行する代わりに、オブジェクトから必要なフィールドを選択するだけの HQL クエリを実行してみてください。オブジェクト自体。

あなたが書いたクエリでは、nHibernate はデータベースからデータをロードしています。これは、あなたが指摘したようにかなり迅速に発生します。ただし、作成したLinqクエリに基づいて、7k Circuitオブジェクトを初期化し、入力し、返します。おそらくしばらく時間がかかります...

この場合、実際には意味のある方法で「オブジェクト」を使用していないため (ドロップダウンのテキストと値のペアのみ)、オブジェクトを構築するために nHibernate は必要ありません。

HQL または LinqToNHibernate でテキスト/値のペアを返すようにコードを変更してみてください。

HQL は次のようになります。

select c.description, c.id from Circuit c
where c.ordercreated = false
orderby c.description

LinqToNhibernate でもこれを実行できることはわかっていますが、手元に簡単な例がありません。

于 2010-10-05T14:45:01.930 に答える
1

待ってください... ドロップダウン リストに 7,000 近くの項目を入れていますか? 私はそれを正しく理解していますか?

もしそうなら、依存ドロップダウンリストをajaxまたは同様のデザインで使用することは可能でしょうか?

これがWeb上にある場合、クライアントコンピューターに送信する必要がある比較的大きなページを見ている可能性が高いため、NHクエリの最適化は時期尚早の最適化になる可能性があります...

于 2010-10-04T18:34:30.933 に答える
1

ドロップダウン リストに 7k のエントリがあると、ユーザー エクスペリエンスが低下します。すでに説明で注文しているので、ユーザーは選択したいものを(少なくとも部分的に)すでに知っていると思います。したがって、完全なリストを提供すると、実際にはユーザーの妨げになります。

あなたはオートコンプリータとは何かを尋ねているので

ユーザーがいくつかの文字を入力する入力フィールドを想像してください。ユーザーが必要なものを入力すると、クエリが起動します。この文字列パラメーターは、結果セットのサイズをさらに制限するために使用されます。

したがって、クエリの実装は次の擬似コードのようなものです。

//passedParameter => "%foo%"
var temp = from x in ActiveRecordLinq.AsQueryable<Circuits>()
              where x.User_Created == false
                and x.Description like passedParameter
              orderby x.Description
              select x;

クエリの実際の実装と、'%foo%' または 'foo%' などを実装するかどうかはあなた次第です。

ユーザー エクスペリエンスは、入力フィールドに 'foo' を書き込むことで減少し、結果はCircuits、ユーザーが必要なものを選択する関連のみを取得します。結果セットがまだ大きすぎる場合、ユーザーは既に入力されている 'foo' に 'b' を追加して 'foob' を作成できます。ここで再びクエリが起動され、さらに制限された結果セットが返されます。

Google で入力すると、その場で提案が表示されます。これは、オートコンプリートの実装です。

于 2010-10-05T15:00:46.483 に答える