2011-03-04 1 views
0

J'utilise un Gridview avec la pagination activée. Je lie le girdview dans l'événement Page_Load en utilisant LINQ to XML.Quelle est la meilleure façon de mettre en cache le résultat d'une requête LINQ to XML utilisant des types anonymes? Comment diffuser l'objet de cache?

Le code ressemble à ceci.

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(); 
     } 
     } 
    } 

La méthode d'extension Count() en partie le reste du code ne fonctionne pas. Je veux savoir la meilleure façon de lancer l'objet cache afin que les méthodes d'extension et tous les trucs LINQ fonctionnent.

+0

lieu de stockage de résultat dans le type anonyme, vous pouvez stocker le résultat dans la classe fortement typée, puis stocké la classe fortement typée dans le cache. –

+0

Si vous avez besoin de code pour cela, faites le moi savoir. –

+0

j'ai essayé aussi. Comment faire pour que toutes les méthodes d'extension LINQ fonctionnent avec mes objets de classe? – getsrirams

Répondre

0

Pour fins de démonstration, j'ai créé un fichier XML à la racine du site, quelque chose comme ci-dessous

<?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; } 

} 
+0

Merci qui a fonctionné. Y at-il de toute façon la même chose peut être fait pour les types anonymes? Je ne peux pas continuer à définir des classes pour chaque requête LINQ que j'utilise dans mon projet. – getsrirams

+0

Je ne suis pas sûr à ce sujet.S'il vous plaît vérifier ce lien http://kirillosenkov.blogspot.com/2008/01/how-to-create-generic-list-of-anonymous.html –

+0

je reçois une erreur lorsque gridview est lié à partir de l'objet cache – getsrirams

Questions connexes