2017-11-22 12 views
0

特定のプロパティへのアクセスを高速化するためにインデックスを作成する必要があるC#クラスのコレクションを作成したいと考えています。キャッチは、クラスには、簡単にシリアライズ/デシリアライズされない既存のサービス/クラスへの参照が多数含まれているため、データベースでは十分ではありません。 LINQを使用してインデックス付きクラスコレクションを作成する

class ComplexTestClass 
{ 
    public MyService Service; 
    public Guid Id; 
    public ComplexObject Object; 
} 

、私はそうのようなコレクションを照会することができます

complexTestClassCollection.where(complexClass => complexClass.Object.Type == "TestType"); 

私のコレクションが増えた場合(これはかなり大規模な取得ん)、これらのLINQクエリは、恐ろしく非効率的です。いくつかのタイプのインデックスを作成して、linqクエリをすべて避けるためにプロパティのルックアップを行うことができます。

私の検索結果はLiteDBになりました。コレクションにインデックスを付ける/クエリを実行するための印象的な方法がありましたが、コレクションをシリアル化/シリアル化する必要がありました。現在のところ、MyServiceは現在シリアル化されていません。大規模な書き換え)。

明確にするために、私はLiteDBのようなより複雑なインデックス作成が必要です。クエリの例は次のようになります。上記の場合

complexTestClassCollection.where(complexClass => complexClass.Object.Type == "TestType" && complexClass.Object.ParentObject == "TestParent" && complexClass.Object.Members.Contains(4)); 

を、私はcomplexClass.Object.Members.Contains(4)でOK complexClass.Object.Type == "TestType" && complexClass.Object.ParentObject == "TestParent"が< 10個の要素まで結果セットを暗くして、インデックスを付け、そのコレクションでLINQを実行することは許容されていませんよ。

+2

辞書を試しましたか? 'Dictionary >' – dovid

+0

私はあなたのオブジェクトをもう少し詳しく記述するべきだと思いますか?コレクションがかなり大きくなっているとどういう意味ですか?これらの他のサービスへの言及は何ですか?オブジェクトをロードするときに他のサービス/クラスへの接続を作成する余裕はありますか?あなたはそれをどのようにインデックス付けしたいのですか?あなたのコレクションの現在のタイプは何ですか? (リスト、配列、辞書) また、私はlinqクエリが非効率的であるとは言いません。データベースに格納する場合でも、linqを使用してデータベースへのアクセスを容易にします。 –

+0

@lomed辞書のみのプロパティ。クラスには、私が検索する必要がある複数のプロパティがあります。 – FrankerZ

答えて

0

Linqクエリは遅延実行に従います。したがって、.ToList()またはToCollection()を実行しない限り、すべての結果が返されません。また、あなたが行っている検索の種類にもよります。私は最初の出口を行うために、LinqのFirst()拡張を好むでしょう。

データをデータベースに格納し、IQueryableを使用してパフォーマンスを向上させることもできます。

長期的には、クエリをSQL文に変換するクエリエンジンを作成するために、スケーラビリティとメンテナンス性があり、大きなクラスを作成するのではなく、異なるクラスにリファクタリングし、タイプとプロパティに対するコレクションとハードコーディング。

+0

"キャッチは、クラスには、簡単にシリアル化/デシリアライズされない既存のサービス/クラスへの参照が多数含まれているため、データベースでは十分ではありません。 – FrankerZ

+0

その場合、独自のカスタムシリアライザを書くことができます。 –

関連する問題