#c# #asp.net
#c# #asp.net
Вопрос:
Я получаю ошибку здесь при сортировке 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.
Спасибо
, Солнце
Ответ №1:
Session["ds"]
содержит var results
и results
является a List<'A>
, где '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"];
Комментарии:
1. Привет, спасибо за ответ. Но как вы предлагаете мне выполнить сортировку. должен ли я реализовать сортировку в списке. Я имею в виду защищенный void GridView1_Sorting(отправитель объекта, GridViewSortEventArgs e) { var list = (Список <AnalyticsGrid>)Сеанс [«ds»];…. ….. } Эти свойства — просто случайные имена, которые у меня есть для этого сообщения.
2. Вы могли бы проверить выражение сортировки, а затем вы могли бы использовать
OrderBy
метод Linq. Например,var query = list.AsEnumerable(); if (e.SortExpression == "ID") { query = query.OrderBy(item => item.ID); }
выполните поиск по сетке сортировки со списком объектов для получения дополнительных идей.