2011-04-07 4 views
1

두 가지 다른 방법으로 호출되는 재사용 가능한 선택 쿼리 메서드가 있습니다.선택 코드의 일부를 다시 사용하는 LINQ에서 집계 쿼리를 작성하는 방법

이들은 내 프로젝트에서 가지고있는 샘플 루틴입니다. SalesQry() 메서드는 실제로 프로젝트에서 매우 복잡합니다. SalesByState() 또는 SalesByArea() 함수가 실행 오전 데 문제가

Private IEnumerable<Sales> SalesQry(SalesDataContext sContext, int customerID) 
{ 
    return 
     from SALE in sContext.Sales 
     where SALE.CustomerID = customerID 
     select SALE 
} 

Public List<SalesAGG> SalesByArea() 
{ 
    SalesDataContext oSContext = new SalesDataContext (.....); 

    return from SALE in SalesQry(sContext,1230) 
       group SALE by 
       new 
       { 
       Type = SALE.SaleType, 
       Area = SALE.Area 
       } into aggAREA 
      select new SalesAGG() 
      { 
       Type = aggAREA.Key.Type, 
       Place = aggAREA.Key.Area, 
       TotalSales = aggAREA.Count() 
      }.ToList();  
} 

Public List<SalesAGG> SalesByState() 
{ 
    SalesDataContext oSContext = new SalesDataContext (.....); 

    return from SALE in SalesQry(sContext,1230) 
       group SALE by 
       new 
       { 
       Type = SALE.SaleType, 
       State = SALE.State 
       } into aggSTATE 
      select new SalesAGG() 
      { 
       Type = aggSTATE.Key.Type, 
       Place = aggSTATE.Key.State, 
       TotalSales = aggSTATE.Count() 
      }.ToList();    
} 

, SQL 서버 대신 그냥 행 많은 수의 반환이 부분을 실행하고, 집계 쿼리를 실행하지

from SALE in sContext.Sales 
      where SALE.CustomerID = customerID 
      select SALE 

및 나머지 부분이 응용 프로그램 내에서 실행되고 있습니다. 함수 SalesQry() 을 호출하지 않고 아래와 같은 쿼리를 변경하지 않으면 SQL Server는 집계 쿼리를 실행하여 매우 적은 수의 행을 반환합니다.

from SALE in sContext.Sales 
where SALE.CustomerID = 1230 
group SALE by 
    new 
    { 
    Type = SALE.SaleType, 
    State = SALE.State 
    } into aggSTATE 
    select new SalesAGG() 
    { 
    Type = aggSTATE.Key.Type, 
    Place = aggSTATE.Key.State, 
    TotalSales = aggSTATE.Count() 
    }.ToList(); 

매우 복잡하고 다른 많은 장소에서 사용되기 때문에 코드를 공유해야합니다. 어떻게 SQL 서버는 함수 SalesQry를() 서버의 전체 집합 쿼리를 실행하고 또한 사용하기 위해 쿼리를 작성해야

답변

3

편집 : 그것은 아마 당신이 대신 IQueryable<Sales>IEnumerable<Sales>를 반환하고 있다는입니다. 나는 처음으로 그것을 잡지 못했다.

데이터베이스 서버에서 new SalesAGG()을 실행할 수 없기 때문에 클라이언트에서 집계를 수행해야한다고 생각합니다. Let 문, 예를 들어 그것을 밖으로 따 버릴보십시오 :

return from SALE in SalesQry(sContext,1230) 
      group SALE by 
      new 
      { 
      Type = SALE.SaleType, 
      Area = SALE.Area 
      } into aggAREA 
     let totalSales = aggAREA.Count() 
     select new SalesAGG() 
     { 
      Type = aggAREA.Key.Type, 
      Place = aggAREA.Key.Area, 
      TotalSales = totalSales 
     }.ToList(); 

을 그가 작동하지 않는 경우에, 나의 다음 직감는 group by 절 점이다하는 newed 업 개체의 그룹. 대신 문자열 연결을 사용하여 group by 기준을 사용해보십시오. 예 :

return from SALE in SalesQry(sContext,1230) 
      group SALE by SALE.SaleType + SALE.Area into aggAREA 
     select new SalesAGG() 
     { 
      Type = aggAREA.First().Type, 
      Place = aggAREA.First().Area, 
      TotalSales = aggAREA.Count() 
     }.ToList(); 
+0

작동 했습니까? :-) –

+0

답장을 보내 주신 Lawrence 께 감사드립니다. 나는 당신의 제안을 시도했으나 효과가 없었습니다. 또한 SalesAGG()를 제거하고 let totalSales = aggAREA.Count()를 사용하여 "select new {Type = aggAREA.Key.Type, Place = aggAREA.Key.Area, TotalSales = totalSales} .ToList()"했습니다. 그것은 여전히 ​​서버에서 모든 데이터를 반환하고 있습니다. – kishore

+0

수정 사항을 참조하십시오. 'group-by'가 익명 타입 대신에 연결 문자열 값으로 변경되면 작동 할 수도 있습니다. –

관련 문제