2011-11-10 20 views
0

モデルには、多対多の関係を持つ2つのエンティティが含まれます。CatalogueItems and Keywordsエンティティフレームワークの多対多選択

は、2つの変数が定義されていると仮定します。

ObjectQuery<Keyword> KW; 
ObjectQuery<CatalogueItem> CI; 

KWキーワードのセットを選択するためのいくつかのクエリが含まれています。 KWの少なくとも1つのキーワードを持つすべてのCatalogueItemを選択するCIを取得する必要があります。

重要なこと:事前計算や列挙は必要ありません。キーワードの列挙には多くの時間がかかりますが、UIは表示されているライブCatalogueItemsに基づいています。完璧なことはCIの実行準備が整っていることです。

答えて

0

このような何か:

from catalogueItem in CI 
from keyword in KW 
where catalogueItem.Keywords.Contains(keyword) 
select catalogueItem 

EDIT: KWは毎回計算されないように、これをやってみてください:

var keywords = KW.ToList() 
from catalogueItem in CI 
from keyword in keywords 
where catalogueItem.Keywords.Contains(keyword) 
select catalogueItem 

そうでなければ、私は、クエリを参照してくださいする必要がありますKWとデータベース全体を使用して、クエリを最適化する方法を知ることができます。

もう1つのオプションは、単にストアドプロシージャを作成し、それをEntity Frameworkにマップすることです。

+0

ありがとうございました。 これは動作しますが、遅すぎます。キーワードを取得するための1回のクエリには数秒かかります。 このクエリは実行されています...わかりません。私は10分間待っていて、それを止めた。すべてのCatalogueItemに対してKWを再計算するように見えます。 また、CatalogueItemsは結果で繰り返されます。 Distinct()はまったく助けません - アプリはちょうどハングし、妥当な時間内に結果を返しません。 私はもっと最適化された方法があるべきだと思います。 – Sergey40a

+0

私の編集をご覧ください。 – Svarog

+0

クエリは「keyword.Value like @ 0 or keyword.Value @ 1 ...」のようになります。データベースには、多対多関係を作成するための遷移テーブル(ItemID、KeywordID)があります。インデックスはOKです。 おそらくSPはこれを実装するより良い方法です... Pity – Sergey40a

0
context.CatalogueItems.Where(ci=> ci.Keywords.Where(cik=>KW.Any(cik))); 

このようなものはありますか?構文を確認してください。

+0

何か間違っています:(ほとんどの内括弧で "cik"は理解できません。 – Sergey40a

関連する問題