Dan*_*ley 4 .net c# linq .net-4.0
我有以下类定义:
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; }
}
Run Code Online (Sandbox Code Playgroud)
我需要加入以下列表:
IEnumerable<int> years= Enumerable.Range(1, 20);
Run Code Online (Sandbox Code Playgroud)
结果将最终显示在网格中,y轴表示Name字段,x轴表示年份.每个单元将汇总Quantity*Price为Name和一年.
我目前正在努力学习语法.我开始加入这些年的实例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) };
Run Code Online (Sandbox Code Playgroud)
这给了我根据需要聚合的数据,但显然排除了没有MyData包含匹配的实例的任何年份Expiration.
我似乎无法弄清楚如何修改我的查询以获取我需要的数据.一旦我得到的年包括我的聚合分解,并能有效地与所有的和最终Price的*Quantity的一个Name,而不是在逐年基础上对所有年.
有一种方法可以在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)
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8157 次 |
| 最近记录: |