说明
目前我的班级看起来像这样:
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。
答案 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
来将记录带入内存以使此查询有效。