2013-10-29 4 views
2

나는 모든 판매 비용을 얻기 위해 쿼리를 작성하고 예상 운송 비용과 비교해야합니다. 나는이 쿼리를 얻을 수 없다,C# Linq GroupBy, 각 그룹의 열 목록을 얻으십시오.

var sales = (from sale in db.Sales 
      where sale.DateOfSale > startDate && sale.DateOfSale < endDate 
      group sale by new {sale.ItemID, sale.EstimatedShipping} into g 
      select new 
      { 
       ItemID = g.Key.ItemID 
       Estimate = g.Key.EstimatedShipping 
       ActualShipCosts = (from gSales in g select gSales.ActualShipping) 
      }).ToList(); 

키에 의해 그룹을 얻거나 g.Count()를 수행하지 않은 그룹과 아무것도하는 쿼리가 끔찍하게 느린 실행하게 보인다 : 여기 내 쿼리입니다 시간 초과없이 끝내기. 여기서 성과를 도울 수있는 방법이 있습니까? 대신이 시도

(from gSales in g select gSales.ActualShipping) 

:

var sales = (from sale in db.Sales 
      where sale.DateOfSale > startDate && sale.DateOfSale < endDate 
      group sale by new {sale.ItemID, sale.EstimatedShipping} into g 
      select new 
      { 
       ItemID = g.Key.ItemID, 
       Estimate = g.Key.EstimatedShipping, 
       ActualShipCosts = g.Select(gSales => gSales.ActualShipping).ToList() 
      }).ToList(); 

이 두 번째 from을 방지 문제를

+0

결과 세트로 무엇을하고 있습니까? 아마도 당신의 목표를 성취 할 수있는 더 좋은 방법이있을 것입니다. –

+0

그룹화하기 전에 쿼리에서 반환하는 예상 레코드 수는 얼마나됩니까? ActualShipCosts가 목록으로 필요합니까? – Krzysztof

+0

그룹화하기 전에 날짜에 따라 약 50,000 개의 결과가 나타납니다. 그룹을 건너 뛰고 나중에 필터링 할 수 있지만 (~ 10 초 소요) 빠른 옵션을 찾으려했습니다. ActualShipCosts를 목록으로 만들고 싶지만 ActualShipCosts 쿼리에 .ToList()를 추가하면 잘못된 쿼리로 보였다. – IrkenInvader

답변

0

당신은 당신이 결과 집합을 구축하는 동안 ActualShipping 선택을 수행 할 수 있습니다.

+0

.GroupBy()와 .ToList() 사이에 .Select (g => new {g.Key, ShipCosts = g.ToList()})가 필요하다고 생각하지만 다음과 같은 오류가 발생합니다. 전에는 Linq가 엔티티에이 메소드를 인식하지 못합니다 ... – IrkenInvader

+0

그 결과를 반복하면서 .ActualShipping을 나열하는 것은 거의 시간이 걸리지 않습니다 ... 감사합니다. 이것이 정확히 필요한 것입니다! – IrkenInvader

0

어려운 시험에 대한 모든 데이터베이스없이 이야기 할 수 있지만,이 선이 될 수 있습니다. 첫 번째 쿼리는 이상한 조인을 수행하는 반면, 간단한 Select를 사용하면 안됩니다.

0

나는 (from gSales in g select gSales.ActualShipping)으로 인해 문제가 발생할 수 있다고 생각합니다. Linq group by은 SQL에서 group by으로 변환되므로 그룹을 구성하는 레코드에 직접 액세스 할 수 없습니다. (from gSales in g select gSales.ActualShipping)의 각 호출은 별도의 선택을 수행합니다.

첫 번째 가능한 해결책 : ItemID, EstimatedShipping 쌍에 색인을 만듭니다.

두 번째 가능한 솔루션 :

var sales = (from sale in db.Sales 
     where sale.DateOfSale > startDate && sale.DateOfSale < endDate 
     select new 
     { 
      ItemID = sale.ItemID 
      Estimate = sale.EstimatedShipping 
      ActualShipCosts = sale.ActualShipping 
     }).ToList(); 

var groupedSales = (from sale in sales 
     group sale by new {sale.ItemID, sale.EstimatedShipping} into g 
     select new 
     { 
      ItemID = g.Key.ItemID, 
      Estimate = g.Key.EstimatedShipping, 
      ActualShipCosts = g.Select(gSales => gSales.ActualShipping).ToList() 
     }).ToList(); 

기록을 다운로드 한 후이이 그룹을 오프라인으로 할 것입니다. 확실하게 쿼리 수를 줄이기는하지만 DB가 더 빠른 지 확인해야합니다.

var sales = db.Sales 
    .Where(sale => sale.DateOfSale > startDate && sale.DateOfSale < endDate) 
    .GroupBy(
     sale => new {sale.ItemID, sale.EstimatedShipping}, 
     sale => sale.ActualShipping) 
    .ToList(); 

확실하지,하지만 추가로 열거하지 못할 수 :