2010-05-27 3 views
3

나는 다양한 방법으로 데이터를 질의하는 방법을 제공하고있다. 우리는 4 가지 fitler 기준을 사용자에게 제공하며 원하는만큼 혼합하고 일치시킬 수 있습니다. 예를 들어다 대다 테이블 조인하기

:

public Fruit GetFruit(Boolean isLocal, string storeName, string classificationType, string state); 

모든 속성 테이블에있을 때 이것은 간단하지만, 내 문제는 데이터 모델의 복잡성의 결과로 발생한다. 내 속성 중 세 가지는 간단합니다. 단지 조인이지만, 일대 다 관계 뒤에 앉아있는 표가 하나 있습니다. 그래서 그것을 쿼리하기 위해 나는 many to many join을해야합니다.

그래서 상점에서 제공하는 모든 과일을 결정하려고합니다. 상점 과일의 목록을 가지고 있으며, 우리의 classificationType이

alt text http://tinyurl.com/39q6ruj

내가 EF이를 조회 할 수 있었던 유일한 성공 방법 (분류에 의해) 모든 과일을 선택하는 많은 관계 (FruitClassification) 뒤에 앉아있다, 필터 기준을 충족하는 모든 매장을 선택한 다음 합치면됩니다.

당신은 EF에서이 쿼리가 작동 될 생각

:

var final = (
       from s in Stores 
       join fc in FruitClassifications.Where(z=>z.Classifications.Code == classificationType && z.Classifications.Type.Code =="FRT").Select(x=>x.Fruit).Distinct() 
       on s.Fruits.Id equals f.Id 
       where s.Name=name && s.isLocal && s.State==state 
       select s 
       ).ToList(); 

하지만 끔찍한 실행 (그리고 내가 그것을 프로파일 링 같은 모양)을, 나는 데이터베이스에 다운이 쿼리를 밀 수있는 방법이 있습니까 ? 더 나은 쿼리 방법은?

+0

어,'mci'은 무엇인가 : –

+0

그것은 오타였습니다 ... 그것은 s (가게)로되어 있었고, 저는 실제 예를 들고 사람들이 이해할 수있는 것으로 바꾸려고했습니다. – Nix

답변

3

나는 이것이 당신이 원하는 무슨 생각? (`select mci`에서와 같이) 저는 쿼리에서 벗어나고 자하는 것이 무엇인지 알아 내려고 노력하고 있습니다.하지만 샘플 쿼리는 의미가 없습니다. 참조가 정의되지 않았기 때문입니다. 상점을 선택하려고하십니까? 과일? 다른 것?
+0

와우, 그게 효과가 있었어. 결과를 두 번 확인 (여전히 충격이 있음)) – Nix

+0

+1, Stores의 필터링 된 목록이 필요하므로 Stores의 필터링 쿼리가 작성됩니다. 좋은 양식. –

-1

http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/

이 당신을 도울 수 있습니다. EF는 디자이너의 탐색 속성을 사용하여 이러한 관계를 생성 할 수 있으므로 조인을 사용할 필요가 없습니다.

var final = (from s in Stores 
      where s.Name=name && s.isLocal && s.State==state 
        && s.Fruits.Any(f => 
         f.FruitClassifications.Any(fc => fc.Code == classificationType 
                  && fc.Type.Code == "FRT")) 
      select s).ToList(); 
+0

그 기사는별로 유용하지 않습니다. 위에서 볼 수 있듯이 나는 어떻게 가입 할 것인지를 알고 있으며 EF 관계의 많은면을 가로 지르는 방법은 없습니다. – Nix