这是我昨天问的一个问题的后续-左外连接和分组。在那道题中我的要求有一点错。
我实际需要的是年份和项目的笛卡尔积,并为每对产生一个值。因此,不使用左连接来获取(例如):
Year Name Value
1 A 100
1 B 300
2 A 150
2 B 200
3 (NONE) 0
4 A 50
我需要确保在我的2个列表中每年和项目都有1行,如果没有与给定年份对应的项目,则将值设置为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是不同项目的数量。
我不认为有任何好的方法来做到这一点(仅在LINQ)。你可以先找到不同的名字,得到年份和这些名字的笛卡尔积,然后在上面加入你的数据。
注。您应该将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;