2011-04-19 113 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 

我需要确保我有1线每年和项目在我2所列出,设置为0的值。如果没有与给定年份相对应的项目。上述随后将变成:

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) 

我试图修改给予其他问题2个回答,但似乎每年/项目对,其中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

谢谢!完全按照要求工作。 – 2011-04-19 12:18:44