2010-11-23 11 views
1

私はパフォーマンスを改善するためのものを探しているうちにこのpostに出くわしました。現在、私のアプリケーションでは、IList<>を全面的に返送しています。これらの返品をすべてAsQueryable()に変更するのは良い考えですか?ここでIList <>ではなく常にIQueryable <>を返さなければなりませんか?

は、私が見つけたものである -

  • AsQueryable() - コンテキスト オープンにする必要があり、あなたはそれが適切に配置する必要があるデータベースコンテキスト の 寿命を制御することはできません。また それは遅延実行(リストと比較して、「高速 フィルタリング」)
  • IList<>である - それはベアボーン 及び軽量インプリメンテーションを提供し、これはList<>上 好ましいすべきです。

また、別のものより優先する必要があるのはいつですか?私は基本を知っていますが、申し訳ありませんが、アプリケーションでいつ、どのように正しく使用するべきかはまだ分かりません。私が何かを返す前にそれを心に留めようとする次回のときにこれを知っていることは素晴らしいことです。たくさんありがとうございます。

答えて

2

基本的には、メモリ内のデータを生成するので、あなたはあなたが必要とする最も広いタイプを参照しようとする必要があり、IListのを返す必要があります。たとえば、ある変数がList<...>と宣言されている場合は、その変数に割り当てることができる値のタイプの制約を設定します。シーケンシャルアクセスだけが必要な場合がありますので、代わりにIEnumerable<...>と宣言すれば十分でしょう。これにより、LINQ操作の結果だけでなく、変数に他の型の値を割り当てることができます。

変数がインデックスでアクセスする必要があることがわかったら、IList<...>を実装する他の型を割り当てることができるように、それをList<...>だけでなく、IList<...>と再び宣言することができます。

関数の戻り値の型は、あなたによって異なります。関数が正確にList<...>を返すことが重要と考えられる場合は、正確にList<...>を返すように宣言します。重要なのはインデックスによる結果へのアクセスだけですが、おそらく正確にList<...>を返すように制約する必要はない場合、戻りタイプをIList<...>と宣言することができます(実際にはこの実装ではList<...>のインスタンスを返します)。後でIList<...>をサポートする別のタイプ)。また、関数の戻り値について唯一重要なことが列挙できることがわかっている場合(インデックスによるアクセスは必要ありません)、関数の戻り値の型をIEnumerable<...>に変更して、自由度を増やす必要があります。

AsQueriableとなっています。これもまたあなたのロジックによって異なります。遅れて評価される可能性がある場合は、不要な計算を避けるために役立つ場合や、別のクエリの一部として使用する予定の場合は、使用することをお勧めします。結果が「現実化」されなければならないと考えられる場合(つまり、現時点で計算された場合)は、List<...>を返すほうがよいでしょう。後で計算が異なるリストになる可能性がある場合は、特に結果を具体化する必要があります。

データベースでは、短期間の中間結果にはAsQueriableを使用しますが、より長い時間内に使用される「最終的な」結果はListです。もちろん、マテリアライズされていないクエリをぶら下げてしまうと、データベースを実際に評価する時点でまだオープンしていないため、データベースをクローズできなくなります。

0

は、SQL Serverの上に任意のさらなる問い合わせを行うことを意図していない場合、それは

0

パフォーマンスが懸念される場合は、できるだけ少ないDB要求でクエリを実行し、最も使用頻度の高いクエリをキャッシュしてください。バッチ・アプローチを使用して要求処理時間を大幅に短縮することは非常に一般的です。

DBからデータを取得するのにどのORMを使用しますか? NHibernateを使用している場合は、FutureMulti Criteria 1Multi Criteria 2およびMulti Queryの使い方についてのこの記事を参照してください。

ご挨拶。

関連する問題