左外连接和分组依据

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*PriceName和一年.

我目前正在努力学习语法.我开始加入这些年的实例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,而不是在逐年基础上对所有年.

Yak*_*ych 8

有一种方法可以在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)