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

时间:2016-01-26 12:50:59

标签: c# linq

说明

目前我的班级看起来像这样:

 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。

1 个答案:

答案 0 :(得分:1)

启动.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);

现在您可能需要在.ToArray()之后放置一个data来将记录带入内存以使此查询有效。