如何在填充类时在 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。
一旦你开始.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()
,以将记录放入内存以使此查询正常工作。