我在排序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结果的数据类型是什么。 谢谢 太阳
答案 0 :(得分:4)
Session["ds"]
持有var results
,results
为List<'A>
,其中'A
是编译器生成的匿名类型 。您无法将其转换为DataSet
。如果你想将它放入会话并稍后检索它,请声明一个合适的类,然后你可以轻松地将列表放入和转出Session。
我的意思是你的查询正在建立一个匿名类型,因为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"];