2015-02-06 3 views
1

두 세트가 있습니다. 사탕과 지역. 각각의 캔디에는 캔디가 특정 지역 (CandyRegion)에서 호출되는 것에 대해 일대 다 이름을 사용합니다.가장 높은 수의 그룹에서 값을 선택하십시오.

CandyRegion.Name이 하나만 선택된 Candy 개체 목록을 작성하려고합니다. 선택한 CandyRegion.Name은 가장 인기있는 지역 (해당 지역에서 사탕 수를 가장 많이 보유한 지역)에 의해 결정됩니다.

가장 인기있는 지역을 찾기 위해 검색어를 수행하는 적절한 방법은 무엇입니까? 내가 지금까지 가지고있는 것 :

context.Candys 
    .Select(c => c.CandyRegions 
     .OrderByDescending(cr => 
      /* 
      * Order CandyRegion by Candy.CandyRegion.Count outside 
      * the context of c? 
      */ 
      context.CandyRegions.Count(cr2 => cr2.RegionId == cr.RegionId) 
     ) 
     .FirstOrDefault() 
    ) 
    .ToList(); 

나는 위 쿼리의 성능이 문제가 될 것이라고 생각한다.

편집 : 클래스

public class Candy 
{ 
    public int Id { get; set; } 
    ... 

    public virtual List<CandyRegion> CandyRegions { get; set; } 
} 

public class Region 
{ 
    public int Id { get; set; } 
    ... 

    public virtual List<CandyRegion> CandyRegions { get; set; } 
} 

public class CandyRegion 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    ... 

    public int RegionId { get; set; } 
    public virtual Region Region { get; set; } 

    public int CandyId { get; set; } 
    public virtual Candy Candy { get; set; } 
} 
+0

두 세트가 있음을 언급합니다. 코드 스 니펫에 의해 캔디 객체에는 캔디 영역의 컬렉션이 포함되어 있습니까? 이 경우 기술적으로 두 개의 개별 콜렉션이 아닌 콜렉션을 포함하는 오브젝트가 있습니다. 이는 어떤 종류의 조인 절이 필요함을 의미합니다. –

+0

@JamesShaw 예, CandyRegion은 Candy 및 Region의 모음입니다. 지역은 두 번째 세트가됩니다. 사탕과 지역은 CandyRegion에 의해 결합됩니다. –

+0

@DamonPollard 문제의 캔디 및 지역 수업을 게시해야한다고 생각합니다. 그것은 혼란을 만듭니다. –

답변

0

당신이 당신과 함께 c.CandyRegion을 가질 수있는 동안 수를 얻기 위해 context에 대해 쿼리 할 어떤 특별한 이유?

아래의 쿼리는 조인과 쿼리 결과가 context이면 내부 쿼리가됩니다.

context.Candy 
    .Select(c => c.CandyRegion 
     .OrderByDescending(cr => 
      /* 
      * Order CandyRegion by Candy.CandyRegion.Count outside 
      * the context of c? 
      */ 
      c.CandyRegion.Count() 
     ) 
     .FirstOrDefault() 
    ) 
    .ToList(); 
+0

이렇게하면 사탕이 가장 많은 지역이 아닌 가장 인기있는 사탕 (대부분의 지역에서 사탕)을 얻을 수 있습니다. 나는 나중에 발견하고 싶다. –

+0

@DamonPollard이 부분이 candyregion 인스턴스 대신 candy 인스턴스를 제공 할 것이라고 생각하는 부분은 무엇입니까? –

+0

죄송합니다. 귀하가 변경 한 사항과 관련된 것이지 쿼리의 결과는 아닙니다. c.CandyRegion.Count()는 대부분의 지역이있는 사탕을 제공하여 잘못된 순서로 나타납니다. –

2

테스트를 거치지는 않았지만이 트릭을 수행해야합니다. 이게 당신의 문제를 해결한다는 걸 알려주세요. 위에서 무슨 일이 일어나고 있는지의

Context.Candys 
       .Where(c => c.Id == c.CandyRegions 
        .FirstOrDefault(cr => cr.RegionId == c.CandyRegions 
         .GroupBy(grp => grp.RegionId) 
          .Select(r => new 
              { 
               RegionId = r.Key, 
               Total = r.Count() 
              } 
            ).OrderByDescending(r => r.Total) 
               .Take(1) 
               .First().RegionId 
            ).CandyId 
         ) 
         .ToList(); 

설명 ... 지역 모두 캔디 이후

는 브리징 테이블로 CandyRegion를 사용하여, 당신은 그것으로 CandyRegion의 캔디의 외래 키 컬렉션 RegionId은 그룹의 수 있습니다.

이렇게하면 각 그룹화 된 집합의 개수를 쉽게 결정할 수 있습니다. 이제 카운트를 얻었으므로 가장 높은 순서에서 가장 낮은 순서로 순서를 지정하고 최상위 항목 만 가져 오려고합니다. 나머지는 신경 쓰지 않습니다.

일단 완료되면 해당 RegionId와 일치하는 목록에 포함 된 첫 번째 CandyRegion을 선택한 다음 CandyId를 동일한 CandyRegion의 CandyID와 비교하는 것입니다.

마지막으로, 모든 작업이 끝나면 그 결과를 내가 말한 캔디라고하는 목록으로 반환합니다.

관련 문제