我有以下类定义:
public class MyData
{
public DateTime Expiration { get; private set; }
public string Name { get; private set; }
public double Price { get; private set; }
public double Quantity { get; private set; }
}
我需要加入一个年份列表:
IEnumerable<int> years= Enumerable.Range(1, 20);
结果最终将显示在一个网格中,y 轴代表 Name
字段,x 轴代表年份。每个单元格都是 Name
和年份的聚合 Quantity
* Price
。
我目前正在为语法苦苦挣扎。我首先将 MyData
的实例加入年份并按如下方式分组:
var myData = GetData();
var query = from data in myData
join year in years on (data.Expiration.Year - DateTime.Now.Year) + 1 equals year
group data by new { Year = (data.Expiration.Year - DateTime.Now.Year) + 1
, Name = data.Name } into grouped
select new {Name = grouped.Key.Name
, Year = grouped.Key.Year
, Value = grouped.Sum(d => d.Quanity * d.Price) };
这为我提供了按需汇总的数据,但显然不包括任何 MyData
实例都不包含匹配的 Expiration
的年份。
我似乎无法弄清楚如何修改我的查询以获取我需要的数据。一旦我得到包含年份的数据,我的聚合就会分解,我实际上得到了 Name< 的所有
所有年份,而不是逐年。Price
* Quantity
的总和
最佳答案
在 LINQ 中有一种左连接的方法,但这是真的 - 语法不是那么清楚。您的查询将如下所示:
var query = from year in years
join data in myData
on year equals (data.Expiration.Year - DateTime.Now.Year) + 1
into year_data
from y_d in year_data.DefaultIfEmpty()
group y_d by new
{
Year = year,
Name = y_d == null ? "" : y_d.Name
}
into grouped
select new
{
Name = grouped.Key.Name,
Year = grouped.Key.Year,
Value = grouped.Sum(d => d == null ? 0 : d.Quantity * d.Price)
};
关于c# - 左外连接和分组依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5704425/