You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用LINQ GroupBy分组交易数据遇ChartDataModel构造函数参数错误求助

问题解决:LINQ分组统计后ChartDataModel构造编译错误

错误根源

你已定位到问题核心:ChartDataModel仅提供带参构造函数,但代码中误用了对象初始化语法(new ChartDataModel { ... })——这种语法要求类必须存在无参构造函数,因此触发编译错误。

两种可行修正方案

方案一:直接调用带参构造函数(推荐)

既然ChartDataModel设计为必须传入processDate和金额参数,直接在LINQ的Select阶段调用带参构造即可,完全符合类的设计意图。

修正后的SpendingSummaryViewModel核心代码:

// 从TransactionStore获取交易数据,按日期(忽略时间部分)分组,统计每日总金额
var dailySpendingSummaries = _transactionStore.Transactions
    // 可选:如果只需统计支出,添加过滤条件(排除信用交易)
    .Where(t => !t.IsCredit)
    // 按ProcessDate的日期部分分组(避免同一日期不同时间被拆分)
    .GroupBy(t => t.ProcessDate.Date)
    // 直接调用ChartDataModel的带参构造,传入分组日期和统计总额
    .Select(group => new ChartDataModel(group.Key, group.Sum(t => t.Amount)))
    .ToList();

// 将结果绑定到UI图表的数据源(例如ObservableCollection)
ChartDataCollection = new ObservableCollection<ChartDataModel>(dailySpendingSummaries);

方案二:给ChartDataModel添加无参构造函数

如果允许修改ChartDataModel的代码,可以添加无参构造函数,保留原有带参构造,这样就能继续使用对象初始化语法。但注意:如果类的设计意图是强制必须传入日期和金额,此方案会破坏封装性,需谨慎使用。

修改后的ChartDataModel代码:

public class ChartDataModel
{
    // 添加无参构造函数
    public ChartDataModel() { }

    // 保留原带参构造函数
    public ChartDataModel(DateTime processDate, double totalAmount)
    {
        ProcessDate = processDate;
        TotalAmount = totalAmount;
    }

    public DateTime ProcessDate { get; set; }
    public double TotalAmount { get; set; }
}

此时原有的对象初始化代码即可正常运行:

var dailySummaries = _transactionStore.Transactions
    .GroupBy(t => t.ProcessDate.Date)
    .Select(g => new ChartDataModel 
    {
        ProcessDate = g.Key,
        TotalAmount = g.Sum(t => t.Amount)
    })
    .ToList();

额外注意点

  • 分组时使用t.ProcessDate.Date而非直接t.ProcessDate,避免同一日期的不同时间点被拆分为多个分组。
  • 如果需要区分交易类型(TransactionType),可以在GroupBy中添加额外分组条件,例如GroupBy(t => new { t.ProcessDate.Date, t.TransactionType })。

内容的提问来源于stack exchange,提问作者Hermes Çati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:01:41