无法强制转换'System.Collections.Generic类型的对象.列表输入'System.D

本文关键字:System 对象 列表 输入 类型 Generic Collections 转换 | 更新日期: 2023-09-27 18:11:14

我在排序gridview这里得到一个错误。我的数据源是一个var结果,我正在通过Linq查询

protected void Page_Load(object sender, EventArgs e)
{
    dt1 = obj1.Table1data().Tables[0];
    dt2 = obj1.Table2data().Tables[0];
    dt3 = obj1.Table3data().Tables[0];
    var results = (
        from table1 in dt1.AsEnumerable()
        join table2 in dt2.AsEnumerable() on (int)table1["id"] equals (int)table2["id"]
        join table3 in dt3.AsEnumerable() on (int)table1["id"] equals (int)table3["id"]
        select new
        {
            id = (int)table1["id"],
            S1= (int)table1["S1"],
            P1= (double)table1["P1"],
            P2= (int)table2["P2"],
            P3= (double)table2["P3"],
            P4 = (int)table3["P4"],
            P5= (double)table3["P5"],
        }).ToList();
    Session["ds"] = results;
    GridView1.DataSource = results;
    GridView1.DataBind();
}
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    DataSet dataSet = (DataSet)Session["ds"];
    DataTable dataTable = dataSet.Tables[0];
    if (dataTable != null)
    {
        DataView dataView = new DataView(dataTable);
        dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
        GridView1.DataSource = dataView;
        GridView1.DataBind();
    }
}
// here in the GridView1_sorting at DataSet dataSet = (DataSet)Session["ds"], I am getting an error
错误:

Unable to cast object of type System.Collections.Generic.List`1[<>f__AnonymousType5`8[System.Int32,System.String,System.Int32,System.Double,System.Int32,System.Double,System.Int32,System.Double]]' to type 'System.Data.DataSet'

2)还有一个问题,var结果的数据类型是什么?谢谢太阳

无法强制转换'System.Collections.Generic类型的对象.列表输入'System.D

Session["ds"]保存var results, resultsList<'A>,其中'A为编译器生成的匿名类型。您不能将其强制转换为DataSet。如果您想将此列表放入会话并稍后检索它,请声明一个适当的类,然后您可以轻松地将列表放入和取出会话。

我的意思是你的查询正在建立一个匿名类型,因为select语句

 select new 
 {

这通常很好,但是您试图通过将此结果放入会话来使用直接本地作用域之外的结果。您需要构建一个适当的类来保存该数据。给它正确的属性。

 public class MyData
 {
      // give it the appropriate properties you need
      public int ID { get; set; }
      public int S1 { get; set; }
      public double P1 { get; set; }
      public int P2 { get; set; }
      public double P3 { get; set; }
      public int P4 { get; set; }
      public double P5 { get; set; }
      // by the way... you should really come up with better names 
      // for these properties!
 }

然后让你的查询

 select new MyData
 {

当您调用ToList()和结果时,您将得到List<MyData>。所以当你从会话中检索这个时,这就是你要将它转换为的。

 var list = (List<MyData>)Session["ds"];
相关文章: