c# - 左外连接和分组依据

标签 c# .net 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; }  
}

我需要加入一个年份列表:

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/

相关文章:

c# - 通过 Lambda 表达式赋值?

asp.net - Linq 检查值是否存在,否则设置默认值

c# - 从 .NET 中的数据库中提取 varbinary 会导致 IndexOutOfRangeException

.net - SetThreadExecutionState(ES_SYSTEM_REQUIRED) 不会阻止 Windows 11 上的系统 sleep

c# - 使用 Azure WebJobs/Azure Functions 在服务队列上安排消息?

c# - Ladislav Mrnka 关于使用 Include 的建议

.net - Entity Framework 4 : Eager Loading (Include) with filters using Self Tracking Entities

linq - Nhibernate 和 linq 问题

c# - 在 Lucene 中索引多个表

c# - winforms 数据目录位置