将Employees会话列表转换为数据表

本文关键字:数据表 转换 列表 Employees 会话 | 更新日期: 2023-09-27 18:18:08

我有一个Session变量,它包含EmployeeView类的Employee对象列表。

 IEnumerable<EmployeeView> Employees = (IEnumerable<EmployeeView>)Session["Employees"];

上面的提取工作得很好,我从会话中得到了预期的返回值。

然而,我正在寻找一个数据表出来:-

DataTable dt = (IEnumerable<EmployeeView>)Session["Employees"] as DataTable;

我的数据表返回null。我不明白这部分流程。

因为上面的过程不起作用,我还创建了一个方法来手动创建表:-

dataTable.Columns.Add(
            new DataColumn()
             {
                 DataType = System.Type.GetType("System.String"),
                 ColumnName = "Name"
             }
            );
            dataTable.Columns.Add(
            new DataColumn()
             {
                 DataType = System.Type.GetType("System.String"),
                 ColumnName = "Address"
             }
            );
            dataTable.Columns.Add(
             new DataColumn()
             {
                 DataType = System.Type.GetType("System.String"),
                 ColumnName = "Phone"
             }
            );
            dataTable.Columns.Add(
             new DataColumn()
             {
                 DataType = System.Type.GetType("System.DateTime"),
                 ColumnName = "DateOfHire"
             }
            );

            foreach (var elem in Employees)
            {
                var row = dataTable.NewRow();
                row["Name"] = elem.Name;
                row["Address"] = elem.Address;
                row["Phone"] = elem.Phone;
                row["DateOfHire"] = elem.DateOfHire;
                dataTable.Rows.Add(row);
            }

然而,当我返回dataTable时,我得到一个空的dt。

我需要做的是更新gridview行:-

   protected void gvwResults_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            IEnumerable<EmployeeView> Employees = (IEnumerable<EmployeeView>)Session["Employees"];
            DataTable dt = (IEnumerable<EmployeeView>)Session["Employees"] as DataTable;
            //using (var reader = ObjectReader.Create(data))
            //{
            //    dt.Load(reader);
            //}
            GridViewRow row = gvwResults.Rows[e.RowIndex];
            dt.Rows[row.DataItemIndex]["Name"] = ((TextBox)(row.Cells[1].Controls[0])).Text;
            gvw_Linq_Results.EditIndex = -1;
            //IEnumerable<EmployeeView> Employees = (IEnumerable<EmployeeView>)Session["Employees"];
            gvwResults.DataSource = Employees;
            gvwResults.DataBind();
        }

将Employees会话列表转换为数据表

正如@Json所说,类型转换不正确。Session["Employees"] as DataTable的结果总是null。

你应该先把它转换成它的实际类型:

var sessionData = Session["Employees"] as IEnumerable<EmployeeView>;

可以将Datatable转换函数声明为IEnumerable<EmployeeView>的扩展方法,这样扩展方法就可以直接调用IEnumerable<EmployeeView>类型的会话数据。

if(sessionData != null)
var table = sessionData.ToDataTable();

Extension方法的定义如下:

public static class Extensions
{
 public static DataTable ToDataTable(this IEnumerable<EmployeeView> source)
 {
    DataTable dataTable = new DataTable();
    dataTable.Columns.Add(
            new DataColumn()
             {
                 DataType = System.Type.GetType("System.String"),
                 ColumnName = "Name"
             }
            );
            dataTable.Columns.Add(
            new DataColumn()
             {
                 DataType = System.Type.GetType("System.String"),
                 ColumnName = "Address"
             }
            );
            dataTable.Columns.Add(
             new DataColumn()
             {
                 DataType = System.Type.GetType("System.String"),
                 ColumnName = "Phone"
             }
            );
            dataTable.Columns.Add(
             new DataColumn()
             {
                 DataType = System.Type.GetType("System.DateTime"),
                 ColumnName = "DateOfHire"
             }
            );
            foreach (var elem in source)
            {
                var row = dataTable.NewRow();
                row["Name"] = elem.Name;
                row["Address"] = elem.Address;
                row["Phone"] = elem.Phone;
                row["DateOfHire"] = elem.DateOfHire;
                dataTable.Rows.Add(row);
            }
      return dataTable;
 }
}

问题是您不能像这样将IEnumerable<EmployeeView>转换为DataTable:

DataTable dt = (IEnumerable<EmployeeView>)Session["Employees"] as DataTable;

上面的结果是dt为null,因为不能在类型之间进行转换,因为它们不兼容。

要解决这个问题,必须执行

List<EmployeeView> employeesFromSesison = Session["Employees"] as List<EmployeeView>;

调用Session["Employees"]将返回一个object类型的对象,然后将其强制转换为List<EmployeeView>类型。

然后需要遍历列表employeesFromSesison并将该数据插入DataTable。我肯定有一种快捷的方法,我自己也不确定。