如何在填充类时在 LINQ 中创建字典

本文关键字:创建 LINQ 字典 填充 | 更新日期: 2023-09-27 18:31:51

描述:

目前我有一个看起来像这样的类:

 public class SupplierSummaryReport {
            public string SupplierName { get; set; }
            public Dictionary<string, decimal> DateValues { get; set; }
        }

使用 LINQ,我尝试创建 SupplierSummaryReport 类的 IQueryable 列表。但是,尝试在 C# 中创建字典时,应用程序将失败。我不确定如何创建字典,有人可以帮忙吗?

LINQ/C#:

 public IQueryable<APData.Audit.Models.ReportModels.SupplierSummaryReport> GetSupplierSummaryReportData() {
            var data = (from i in _ctx.Invoices
                        where i.Turnover == true
                        select new {
                            Year = i.InvoiceDate.Year.ToString(),
                            AccountName = i.AccountName,
                            Value = i.NetAmount_Home ?? 0
                        });
            return data.GroupBy(r => new { r.Year, r.AccountName })
                .Select(g => new APData.Audit.Models.ReportModels.SupplierSummaryReport {
                    SupplierName = g.Key.AccountName,
                    //I believe it fails when creating the dictionary
                    DateValues = new Dictionary<string, decimal> {
                        {g.Key.Year, g.Sum(r=> r.Value)}
                    }
                }).OrderBy(r => r.SupplierName);
        }

预期成果:

Supplier Name = "Test", DateValues = {2010, 500}
Supplier Name = "Test2", DateValues = {2011, 900}

实际结果:

收到此错误:

仅支持具有单个元素的列表初始值设定项 LINQ to Entities。

如何在填充类时在 LINQ 中创建字典

一旦你开始.Select(g =>,就没有必要创建一个字典,因为你只有一个g.Key。如果您尝试过,则只会创建一个包含一个元素的字典。我认为你的逻辑是错误的。

我认为这就是您的return陈述应该的样子:

return
    data
        .GroupBy(r => r.AccountName)
        .Select(g => new APData.Audit.Models.ReportModels.SupplierSummaryReport
        {
            SupplierName = g.Key.AccountName,
            //I believe it fails when creating the dictionary
            DateValues = g
                .GroupBy(x => x.Year, x => x.Value)
                .ToDictionary(x => x.Key, x => x.Sum())
        })
        .OrderBy(r => r.SupplierName);

现在,您可能需要在data后放置一个.ToArray(),以将记录放入内存以使此查询正常工作。