Linq Excel文件打印SYSTEM.LINQ.ENUMERABLE +而不是值C#

我在C#MVC工作。 我有一个导出到.csv文件并导出的报告,但我似乎无法得到我的编码权利抓住文件的胆量。 我有列标题和框架,但我试图从数据库中拉出第一个值给我这个长…string。 我尝试了一堆连击,但我的大脑没有看到问题。 我的代码如下。

public IEnumerable<SummaryRow> GetSummaryRows(int yearSetupId) { var x = _db.Items.Select(o => o.ItemPayments.Select(p => p.ItemPaymentSplits.Where(q => q.YearSetupId == yearSetupId))).ToList(); return x .Select(item=> new { Year = item.Select(a => a.Select(b => b.YearSetup.Name)).ToString(), }) .AsEnumerable() // EF barrier .Select(i => new SummaryRow() { Year = i.Year, }); } 

发生这种情况是因为从该方法获得的数据是IEnumerable<SummaryRow>types

将结果保存为string时,将调用ToString()方法。 IEnumerable<SummaryRow> ToString()可能是你得到的结果。

我会build议创build方法:

 public string FlatenSummaryRows(IEnumerable<SymmaryRow> summaryRows) { //here make your collection flat string result = string.Empty; for each (var item in summaryRows) { result += $"this is my item {item.prop1}"; } } 

然后调用它的方法: GetSummaryRows结果

因为您没有发布生成CSV文件的代码,所以不能说出了什么问题。 使用像Epplus这样的库来生成真正的Excel文件要容易得多 :

 public ActionResult ExportData(int yearSetupId) { //.... var rows=GetSummaryRows(yearSetupId); using (ExcelPackage package = new ExcelPackage()) { var ws = package.Workbook.Worksheets.Add("My Sheet"); //true generates headers ws.Cells["A1"].LoadFromCollection(rows, true); var stream = new MemoryStream(); package.SaveAs(stream); string fileName = "myfilename.xlsx"; string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; stream.Position = 0; return File(stream, contentType, fileName); } } 

这样可以避免由于文本列中的本地化,换行符或分隔符等原因导致的转换问题。

Epplus使用reflection来查找集合对象中的属性和types,并使用适当的格式(例如数字,date等)生成相应的单元格。LoadFromCollection或等效的LoadFromDatatable返回一个ExcelRange对象,您可以使用该对象来设置整个范围的样式,附加名字,生成表格等

我最终直接从数据库中拉出,并使用where语句。

 return _db.Items .Where(a => a.ItemPayments.Any(b => b.ItemPaymentSplits.Any(c => c.YearSetupId == yearSetupId))) .GroupBy(a => yearSetupId)