2016-10-02 9 views
0

現在、私は7,000のビデオエントリを持っており、タグと女優を検索するのに苦労しています。LINQリスト内のリストにオブジェクトが存在するかどうかを調べるための最適化

これは私が修正しようとしているコードです。私はHashSetを使ってみました。それは私が初めてそれを使用しているが、私はそれを正しくやっているとは思わない。

 Dictionary dictTag = JsonPairtoDictionary(tagsId,tagsName); 
     Dictionary dictActresss = JsonPairtoDictionary(actressId, actressName); 
     var listVid = new List<VideoItem>(db.VideoItems.ToList()); 
     HashSet<VideoItem> lll = new HashSet<VideoItem>(listVid); 
     foreach (var tags in dictTag) 
     { 
      lll = new HashSet<VideoItem>(lll.Where(q => q.Tags.Exists(p => p.Id == tags.Key))); 
     } 
     foreach (var actress in dictActresss) 
     { 
      listVid = listVid.Where(q => q.Actress.Exists(p => p.Id == actress.Key)).ToList(); 
     } 

私は、それはタグが各VideoItemについて

を存在する場合、それはList<Tags>を持っており、私が使用をチェックするループを通過しますdb.VideoItems.ToList()

を使用してDB内のすべてのビデオを取得する最初の部分タグが一致するかどうかを確認するために '存在'します。

次に女優と同じこと。

私はデバッグモードになっていて、ApplicationInsightがアクティブであるが遅いので、わかりません。そして、私はそれがまだデータベースに接続していることを意味するかどうかわからないbaseType:RemoteDependencyDataで毎秒10〜15回のイベントになるでしょう(私はすべてのビデオの新しいリストを乱すべきであるからではありません)。

7分後、まだ処理されていて、それは私が待っていた最長時間です。

私は、これはお菓子

+0

すべてのタグまたは任意のタグに一致する必要がありますか? –

+0

あなたはどのようなデータベースを引き出していますか? 'db.VideoItems'の型は何ですか?私は絶対にToList()を介してすべてのビデオを引っ張ってLINQでフィルタダウンしないでください - あなたが行う必要がある場合にのみ、データベースで索引付けされたアイテムを使用してLINQを使用してインテリジェントなクエリを構築しますデータプロバイダが実行できない非常に高度なフィルタリング。 – PMV

+0

私は 'db.VideoItems.Where(q => q.Tags.Exists(p => p.Id == 90));' #90は、私がテストしている単なるサンプルタグです。 それはずっと速かった、私の問題は、データベースにないサーバーに検索の負荷をかけていたと思う。 私の問題は、2つまたは3つのタグが女優のコードにも当てはまる可能性があるため、どのようにしてプロセスを繰り返すことができるのかです。 –

答えて

0

の代わりに、あなたのデータベースクエリを最適化する必要がありますLINQを最適化するように私のリソースを食べるようになるので、私のライブサイトでこれを置くことを恐れています。 データベースは、最適化された検索とサブセットの作成で優れており、作成するものよりもおそらく高速です。複数のデータベースパラメータに基づいてサブセットを作成する必要がある場合は、インデックスを作成して使用することをお勧めします。

編集:(実際には複数のネストされたループであり、時間遅延がどこから来る)ループの最初排除するDBクエリの

例:

select * from videos where tag in [list of tags] 

EDIT2

これが最も効率的であることを確認するには、データベースでTAGS列のインデックスを作成する必要があります。インデックスを作成するには:それはすることができます使用されているとして、あなたのインデックスが表示されない場合

CREATE INDEX video_tags_idx ON videos (tag) 

使用してインデックスが自動的に使用されているかどうかを確認するために「説明」を

explain select * from videos where tag in [list of tags] 

(それはする必要があります)それを強制的に使用する構文を調べてください。

+0

どうすればいいですか?私のシナリオで考える例を与えることができますか? –

+0

'Contains'を見てください。 –

+0

INの上にContainsを使用する理由を教えてもらえますか? – BoldAsLove

0

問題は最適化ではありませんでしたが、Microsoft SQLまたは私のApplicationDbContextを使用していました。

私はhttp://www.albahari.com/nutshell/predicatebuilder.aspx

キーワード検索の問題は、複数のキーワードがあることができ、私は上記の作ったコードが長い実行時間を作ったSQLを使用しないのでことを認識したとき、私はこれを見つけました。

述語ビルダを使用すると、LINQで動的条件を作成することが可能です

関連する問題