2011-11-10 3 views
0

이 모델에는 many-to-many 관계를 갖는 두 개의 엔터티가 포함됩니다. CatalogueItems and Keywords. Entity Framework 다 대다 선택

는이 개 변수가 정의되어 있다고 가정 :

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

KW 키워드의 집합을 선택하는 몇 가지 쿼리가 포함되어 있습니다. KW에서 하나 이상의 키워드가있는 모든 CatalogueItem을 선택하는 CI을 가져와야합니다.

중요한 것은 미리 계산하거나 나열해야합니다. 키워드 열거에는 많은 시간이 필요하지만 UI는 표시되는 실시간 CatalogueItem을 기반으로합니다. 완벽한 것은 CI을 실행할 준비가되어있는 것입니다. 이 같은

답변

0

뭔가 : KW가 때마다 계산되지 않도록,이 일을 시도 그래서 : 편집

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

그렇지 않으면

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

을, 나는에 쿼리를 참조해야합니다 KW 및 전체 데이터베이스를 사용하여 쿼리를 최적화하는 방법을 알 수 있습니다.

또 다른 옵션은 단순히 저장 프로 시저를 작성하고이를 Entity Framework로 매핑하는 것입니다.

+0

감사합니다. 작동하지만 너무 느립니다. 키워드를 가져 오는 단일 쿼리에는 몇 초가 걸립니다. 이 쿼리는 실행 중입니다 ... 잘 모르겠습니다. 나는 10 분 동안 기다렸다가 꺼냈다. 모든 CatalogueItem에 대해 KW를 다시 계산하는 것처럼 보입니다. 또한 CatalogueItems가 결과에서 반복됩니다. Distinct()는 전혀 도움이되지 않습니다 - 앱이 멈추고 합리적인 시간에 결과를 제공하지 않습니다. 나는 더욱 최적화 된 방법이 있어야한다고 생각합니다. – Sergey40a

+0

제발 편집을 참조하십시오. – Svarog

+0

쿼리는 "keyword.Value like @ 0 또는 keyword.Value @ 1 ..."과 같습니다. 데이터베이스는 다 대다 관계를 만들기위한 전이 테이블 (ItemID, KeywordID)을 가지고 있습니다. 색인은 괜찮습니다. 아마도 SP가 이것을 구현하는 더 좋은 방법입니다 ... 동정 – Sergey40a

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

그런가요? 구문을 확인하십시오.

+0

잘못된 것 :(가장 안쪽 괄호에서 "cik"을 이해하지 못합니다. – Sergey40a

관련 문제