将临时属性添加到对象列表

时间:2014-07-31 19:14:41

标签: c# asp.net-mvc list

我有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,L​​abel,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.除非我想硬编码值,否则它不是一个选项。

由于

2 个答案:

答案 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.