2011-11-10 45 views
0

該模型包含2個具有多對多關係的實體:CatalogueItems and Keywords實體框架多對多選擇

假設2個變量定義:

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

KW包含選擇一組關鍵字的一些查詢。我需要CI選擇至少有一個來自KW的關鍵字的所有CatalogueItems。

一件重要的事情:什麼都不應該預先計算或枚舉。關鍵字枚舉需要很長時間,但UI基於實時CatalogueItems顯示。一個完美的事情就是讓CI準備好執行。

回答

0

事情是這樣的:

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

編輯: 使KW不會每次計算,嘗試這樣做:

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

否則,我需要看到該查詢KW和你的整個數據庫能夠知道如何優化查詢。

另一種選擇是簡單地編寫一個存儲過程並將其與實體框架進行映射。

+0

謝謝。 它的工作原理,但tooooooo緩慢。用於提取關鍵字的單個查詢需要幾秒鐘。 此查詢正在運行...我不知道。我一直保持10分鐘,並關閉它。看起來它爲每個CatalogueItem重新計算KW。 此外,CatalogueItems在結果中重複。 Distinct()完全沒有幫助 - app在合理的時間內掛起並沒有結果。 我相信應該有一個更優化的方式。 – Sergey40a

+0

請參閱我的編輯。 – Svarog

+0

查詢就像「keyword.Value like @ 0 or keyword.Value like @ 1 ...」。數據庫有一個用於建立多對多關係的過渡表(ItemID,KeywordID)。索引是好的。 也許SP是一個更好的方式來實現這...可惜 – Sergey40a

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

這樣的事情?請檢查語法。

+0

有什麼問題:(它不明白「cik」在最內部的括號內。 – Sergey40a