我有3个模特
public class Payroll
{
public int ID { get; set; }
public DateTime Date { get; set; }
public int PayCategoryID { get; set; }
public virtual PayCategory PayCategory { get; set; }
}
这一个:
public class PayCategory
{
public int ID { get; set; }
public string PayScenario { get; set; }
public int PayGroupID { get; set; }
public virtual PayGroup PayGroup { get; set; }
}
和这一个:
public class PayGroup
{
public int ID { get; set; }
public string Label { get; set; }
public string Description { get; set; }
public string EntryType { get; set; }
}
如果我创建一个Payroll列表,我将只获得一个Payroll对象列表,每个对象有4个属性。 我想要一个列表,其中每个Payroll对象都有字段 Date,PayScenario,Label,Description和EntryType。我知道这些可以通过
轻松获得 Payroll.PayCategory.PayScenario
Payroll.PayCategory.PayGroup.Label
等。
但我使用这种通用方法将这些导出到excel文档:
public static void Export(List<T> data, string name, Controller controller)
{
XLWorkbook workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add(name);
worksheet.Cell(1, 1).InsertTable(data);
controller.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheet.sheet";
controller.Response.AddHeader("content-disposition", String.Format(@"attachment;filename={0}.xlsx", name.Replace(" ", "_")));
using (MemoryStream memoryStream = new MemoryStream())
{
workbook.SaveAs(memoryStream);
memoryStream.WriteTo(controller.Response.OutputStream);
memoryStream.Close();
}
controller.Response.End();
}
我从控制器那里打来电话:
public ActionResult ExportData()
{
var payrolls = (List<Payroll>)Session["payrolls"];
ExportToExel<Payroll>.Export(payrolls, "Payroll", this);
return RedirectToAction("Index");
}
结果当然给了我一个简单的表格,其中只有值Date,(加上一些其他垃圾栏,如System [...] PayCategory)
最终,我希望合并这三个模型的属性(不包括ID),以便为我提供一个可以传递给ExportData方法的列表。在,有没有办法将列添加到对象列表?类似于
的东西 for(int i = 1; i<payrolls.Count; i++)
payrolls[i].Add.(payrolls[i].PayCategory.PayScenario);
当然,这不起作用。 请不要问我为什么不简单地使用一个模型而不是这些模型3.除非我想硬编码值,否则它不是一个选项。
由于
答案 0 :(得分:1)
您正在寻找的是一个&#34;匿名对象&#34;。
用法示例:
var anonymousObject = new
{
ID = payrollObj.Id,
// other payroll properties
PayScenario = payrollObj.PayCategory.PayScenario
// other extended properties
};
这是一篇关于他们的文章 http://www.c-sharpcorner.com/UploadFile/ff2f08/anonymous-types-in-C-Sharp/
这里的建议是在循环中创建一个新的匿名对象,并将其传递给excel函数而不是原始的payrollObject。
答案 1 :(得分:1)
如果您可以导入Linq,您可以执行以下操作:
var payrolls = from aPayroll in (List<Payroll>)Session["payrolls"]
select new {
Date = aPayroll.Date,
PayScenario = aPayroll.PayCategory.PayScenario,
Label = aPayroll.PayGroup.Label,
Description = aPayroll.PayGroup.Description,
EntryType = aPayroll.PayGroup.EntryType
};
这将创建一个具有您想要的五个属性的匿名类型。
假设您正在使用ClosedXML,您还应该能够create a DataTable and send it directly to a worksheet.