Невозможно привести объект типа ‘System.Коллекции.Общий.Список для типа ‘System.Data.DataSet’

#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); } выполните поиск по сетке сортировки со списком объектов для получения дополнительных идей.