2011-04-19 7 views
0

어제 물어 본 질문에 대한 후속 조치입니다. Left outer join and group by. 나는 약간의 질문에 대한 나의 요구 사항이 잘못되었다.그룹화가있는 데카르트 제품

실제로 필요한 것은 각 페어링에 대해 생성 된 값으로 연도와 항목의 데카르트 곱입니다. 그래서, 대신 왼쪽을 사용 (예를 들어) 얻을 가입 :

Year Name Value 
1  A  100 
1  B  300 
2  A  150 
2  B  200 
3  (NONE) 0 
4  A  50 

내가 더이 경우 내가 0으로 설정 값으로, 제 2 목록에서 매년 항목에 대한 1 개 라인이 없도록해야합니다 주어진 해에 해당하는 항목. 다른 질문에 주어진 두 답변을 수정

Year Name Value 
1  A  100 
1  B  300 
2  A  150 
2  B  200 
3  A  0 (data for year 3 is missing for item A, so include a 0 valued row) 
3  B  0 (data for year 3 is missing for item B, so include a 0 valued row) 
4  A  50 
4  B  0 (data for year 4 is missing for item B, so include a 0 valued row) 

나는 시도했지만 X는 별개의 항목의 수 년/항목 쌍 당 행의 X 번호로 끝날 것 같다 : 위는 다음이 될 것입니다.

답변

2

좋은 방법이 없다고 생각합니다 (LINQ 내에서만). 뚜렷한 이름을 먼저 찾아 내고, 년과 그 이름의 데카르트 곱을 얻은 다음 그 데이터를 합칠 수 있습니다.

p.s. 필드를 Price 필드의 십진수 (여기서는 가정)로 변경하고 Quantity을 필수 유형으로 변경해야합니다.

var now = DateTime.Now; 
var altData = myData 
    .Select(data => new 
    { 
     Year = (data.Expiration.Year - now.Year) + 1, 
     data.Name, 
     Value = Decimal.Multiply(data.Quantity, data.Price), 
    }); 
var names = myData.Select(data => data.Name).Distinct(); 
var years = Enumerable.Range(1, 20); 
var query = from Year in years 
      from Name in names 
      join data in altData 
       on new { Year, Name } 
       equals new { data.Year, data.Name } 
       into joined 
      from data in joined.DefaultIfEmpty(new { Year, Name, Value = 0M }) 
      select data; 
+0

감사! 필요한만큼 정확하게 작동합니다. –

관련 문제