2014-02-24 2 views
0

나는 내 데이터베이스에 액세스하기 위해 Linq (함께 EF)를 사용합니다. 나는 몇몇 속성을 포함하는 "Job"이라는 객체를 가지고 있는데, 그 중 일부는 "복잡하다". 내 목표는 이러한 속성별로 작업을 그룹화하고 각 그룹의 수를 얻는 것입니다.Linq 그룹화에 대한 또 다른 질문

다음

내 개체 (간체) :

public class Job 
{ 
    [Key] 
    public int Id 
    { 
     get; 
     set; 
    } 


    [Required] 
    public Salary Salary 
    { 
     get; 
     set; 
    } 


    [Required] 
    public ICollection<Category> Categories 
    { 
     get; 
     set; 
    }  
} 

"카테고리"복잡한 클래스이며, 다음과 같습니다 는 산업, 필드, 위치 및 급여 클래스는 "INT를

public class Category 
{ 
    [Key] 
    public int Id 
    { 
     get; 
     set; 
    } 

    public Industry Industry //Example: Software 
    { 
     get; 
     set; 
    } 


    public Field Field //Example: .NET 
    { 
     get; 
     set; 
    } 


    public Position Position //Example: Developer 
    { 
     get; 
     set; 
    } 
} 

을 포함

"id와"문자열 "이름.

업계, 분야, 직위 및 연봉별로 일자리 목록을 그룹화하고 각 그룹의 수를 얻어야합니다. 이것은 바로 지금 내가하는 일이다.

var IndustryGroupsQuery = from t in Jobs.SelectMany(p => p.Categories) 
              group t by new { t.Industry} into g 
              select new 
              { 
               Tag = g.Key.Industry, 
               Count = g.Count() 
              }; 

var FieldsGroupsQuery = from t in Jobs.SelectMany(p => p.Categories) 
              group t by new { t.Field} into g 
              select new 
              { 
               Tag = g.Key.Field, 
               Count = g.Count() 
              }; 

var PositionsGroupsQuery = from t in Jobs.SelectMany(p => p.Categories) 
              group t by new { t.Position} into g 
              select new 
              { 
               Tag = g.Key.Position, 
               Count = g.Count() 
              }; 

Jobs.GroupBy(job => job.Salary) 
         .Select(group => new 
         { 
          Tag = group.Key, 
          Count = group.Count() 
         })) 

이것은 잘 작동하지만 어떻게 든 성능을 향상시킬 수 있는지 궁금하다.

1 : 아마도 하나의 단일 쿼리가 4 개를 더 잘 수행 할 것이라고 생각합니다. 이 쿼리를 하나의 쿼리로 결합 할 수 있습니까?

질문 2 : Linq에게 "산업"별로 그룹화하도록 요청할 때 산업별로 구분할 수있는 방법은 무엇입니까? 레코드의 키를 암시 적으로 비교합니까? linq에게 그룹화 할 속성 (예 : "id")을 명시 적으로 지정하면 더 빠를 수 있습니까?

감사합니다. 역순

답변

0

않음 :

Q2 :
대신 기본 유형의 객체에 의해 기, 그것은 단순한 기준 비교를 수행한다 (OBJ X == OBJ Y) 표준 같음 비교를 사용하는 경우 (http://msdn.microsoft.com/en-us/library/bsc2ak47(v=vs.110).aspx). 당신이 그룹의 하위 그룹을 원한다면,
당신은 하나의 쿼리에서 그것을 할 수 있습니다 : 그것은 맞는 경우, 작동, 그렇지 않으면 사용자 지정 같음 비교 (How to implement IEqualityComparer to return distinct values?)

Q1을 구현할 수 있습니다. 각각에 대한 카운트를 원한다면 정확히 옳은 방식으로 수행하고 있습니다.

+0

쿼리가 DB에서 실행되는 경우 어떻게 비교할 수 있습니까? – Illidan

0

사용자 조건부 GROUP BY을 사용할 수 있습니다.

그룹화에 사용할 열을 쿼리에 알려주도록 변수를 정의 할 수 있습니다. GROUP BY 열의 ENUM을 정의 할 수 있습니다.

int groupByCol = 1; //Change the value of this field according to the field you want to group by 

var GenericGroupsQuery = from t in Jobs           
          group t by new { GroupCol = (groupByCol == 1 ? t.Industry:(groupByCol == 2 ? t.Field:(groupByCol == 3 ? t.Position : t.Job)))} into g 
          select new 
          { 
           Tag = g.Key, 
           Count = g.Count() 
          };