Каков наилучший способ кэширования результатов запроса LINQ to XML, который использует анонимные типы? Как привести объект в кеш? - PullRequest
0 голосов
/ 04 марта 2011

Я использую Gridview с включенной подкачкой. Я связываю girdview в событии Page_Load, используя LINQ to XML.

Код выглядит следующим образом.

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {            
        if (Cache["grid"] == null)
        {
            DataSet ds = new DataSet();
            ds.ReadXml(HttpContext.Current.Server.MapPath("~/CarRentalAddress.xml"));
            var grid = (from d in ds.Tables[0].AsEnumerable() orderby d.Field<string>("City") where d.Field<string>("Enabled") == "1" select new { City = d.Field<string>("City"), HotelName = d.Field<string>("HotelName"), Address = d.Field<string>("Address"), EmailID1 = d.Field<string>("EmailID1"), EmailID2 = d.Field<string>("EmailID2") }).ToList();
            Cache["grid"] = grid;
            totalrows = grid.Count().ToString();
            grdAddress.DataSource = grid;
            grdAddress.DataBind();
        }
        else
        {
            var grid = Cache["grid"];
            //Extension method Count() is not working here
            totalrows = grid.Count().ToString();
            grdAddress.DataSource = grid;
            grdAddress.DataBind();
        }
        } 
    }

Метод расширения Count () в остальной части кода не работает. я хочу знать лучший способ приведения объекта кеша, чтобы методы Extension и все вещи LINQ работали.

1 Ответ

0 голосов
/ 04 марта 2011

Для демонстрации я создал XML-файл в корне веб-сайта, что-то вроде ниже

<?xml version="1.0" encoding="utf-8" ?>
<Persons>
  <Person>
    <FirstName>F1</FirstName>
    <LastName>L1</LastName>
    <Age>31</Age>
  </Person>
  <Person>
    <FirstName>F2</FirstName>
    <LastName>L2</LastName>
    <Age>22</Age>
  </Person>
  <Person>
    <FirstName>F3</FirstName>
    <LastName>L3</LastName>
    <Age>25</Age>
  </Person>
</Persons>

CodeBehind

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

public partial class Default3 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

        if (!IsPostBack)
        {
            if (Cache["grid"]== null)
            {

                var grid = (from d in GetData().Tables[0].AsEnumerable()
                            orderby d.Field<string>("FirstName")
                            where d.Field<string>("Age") == "31"
                            select new Person()
                            {
                                FirstName = d.Field<string>("FirstName"),
                                LastName = d.Field<string>("LastName"),
                                Age = d.Field<string>("Age")

                            }).ToList();

                Cache["grid"] = grid;
                int totalrows = grid.Count();

                GridView1.DataSource = grid;
                GridView1.DataBind();
            }
            else
            {
                var grid = (List<Person>)Cache["grid"];
                //Extension method Count() is not working here
                int totalrows = grid.Count();
                GridView1.DataSource = grid;
                GridView1.DataBind();
            }
        }

    }

    public static DataSet GetData()
    {

        DataSet ds = new DataSet();
        ds.ReadXml(HttpContext.Current.Server.MapPath("Person.xml"));
        return ds;

    }
}
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Age { get; set; }

}
...