IQuery対応辞書のパフォーマンス
-
14-11-2019 - |
質問
起動時に私のアプリに静的メタデータを全体的にキャッシュしています。それはdBからのものであり、たくさんの外部キーの関係があります。私はそれらをモデル化する最善の方法を探しています。 私はちょうどlinqで始めました。
クラスを宣言するのは簡単です
public class AllData {
public static IQueryable<libm_ColPurpose> IQ_libm_ColPurpose = libm_ColPurpose.All();
public static IQueryable<libm_ColType> IQ_libm_ColType = libm_ColType.All();
...
.
(私はサブソニック3を使ってクラスを生成していますが、それはポイントのそばに)です。
それから私はiQueryable<T
>メンバーを使って私が欲しいものにアクセスすることができます、例えば:
libm_ColType ct = AllData.IQ_libm_ColType.SingleOrDefault(x => x.ColTypeStr == this.DefaultJetColTypeStr);
.
IQUERYABLEを使用する前に、辞書を使用してFK関係を保存していたので、上記のコードを模倣するために、既存のListGenerAcoditagcode>リストから次のコードをコーディングします。
Dictionary<string, libm_ColType> colTypeByColTypeStr = new Dictionary<string, libm_ColType>();
foreach (libm_ColType x in list) { rtn.Add(x.ColTypeStr, x); }
.
それから私はを使うことができました
libm_ColType ct = colTypeByColTypeStr[this.DefaultJetColTypeStr];
.
OK、ついに私たちは質問に着きます!
IDによる辞書ルックアップは非常に効率的ですが、IQUERYABLEソリューションははるかに柔軟でエレガントです。
パフォーマンスがヒットしているのは、iQueryableを使うつもりです。私がそれを呼び出すたびにリストの線形スキャンをしていると思われます。 私がユニークな値の列を識別し、最初のルックアップの後にハッシュテーブルとキャッシュされているのであれば、それは素晴らしいことですが、私はこれが提供の一部になるつもりはないと思います。
これは、LINQを使用することについての私のためのディレッカーの少しです。
注データデータベースからデータを引いていないこと、すでにメモリに入っていて、そこに照会しているので、IQueryable<libm_ColType
を検索するのに興味深いだけです。 。
解決
iQueryableはデータストア内のコレクションを表します。メモリー内コレクションを明示的に希望する場合は、辞書に戻ります。覚えておいてください、これはあなたがデータを介してLINQクエリを使うのを妨げることはできません。