2008-10-27 7 views
0

Je suis en train de construire un site web et j'ai juste implémenté SqlCacheDependency en utilisant LinqToSQL comme ça.Dois-je toujours voir la requête dans SQL Profiler?

public IQueryable<VictoryList> GetVictoryList() 
    { 
       string cacheKey = HttpContext.Current.User.Identity.Name + "victoryCacheKey"; 
       IQueryable<VictoryList> cachednews = (IQueryable<VictoryList>)HttpContext.Current.Cache.Get(cacheKey); 

       if (cachednews == null) 
       { 

        var results = from v in _datacontext.ViewVictoryLists 
            orderby _datacontext.GetNewId() 
            select new VictoryList 
            { 
             MemberID = v.MemberID, 
             Username = v.Aspnetusername, 
             Location = v.Location, 
             DaimokuGoal = v.DaimokuGoal, 
             PreviewImageID = v.PreviewImageID, 
             TotalDaimoku = v.TotalDaimoku, 
             TotalDeterminations = v.TotalDeterminations, 
             DeterminationID = v.DeterminationID, 
             DeterminationName = v.DeterminationName 
            }; 
        SqlCacheDependency dependency = 
        new SqlCacheDependency(_datacontext.GetCommand(results) as SqlCommand); 

        HttpContext.Current.Cache.Add(cacheKey, results, dependency, DateTime.MaxValue, 
            TimeSpan.Zero, CacheItemPriority.Normal, null); 

        return results.ToList().AsQueryable(); 
       } 
       return cachednews; 
    } 

Il semble fonctionner comme les choses sont plus rapides noticbly en particulier sur certaines requêtes complexes, mais en regardant les choses en SQLProfiler Je vois encore la requête exécutée par, j'utilise le mode CommandBroker de SqlCacheDependency. Dois-je toujours voir la requête même si les données proviennent évidemment d'un objet mis en cache?

Répondre

4

Je pense que le problème est que vous stockez IQueryable dans votre cache, puis cacheednews contient un IQueryable qui frappe la base de données.

Essayez les modifications suivantes.

public IQueryable<VictoryList> GetVictoryList() { 
      // ... 
      if (cachednews == null) 
      { 

       var results = from // ... 
       results = results.ToList().AsQueryable(); // force query execution 

       SqlCacheDependency dependency = // ...; 
       HttpContext.Current.Cache.Add(cacheKey, 
        results, // now just the result are stored 
        dependency, 
        DateTime.MaxValue, 
        TimeSpan.Zero, 
        CacheItemPriority.Normal, 
        null); 

       return results; 
      } 
      return cachednews; 
} 
+0

Oui, cela a fonctionné grâce à un tas .... – dswatik