2010-08-25 7 views
0

J'utilise LINQ pour les données de pagination sur mon site Web. J'utilise actuellement Skip() et Take() pour effectuer la pagination. Maintenant, je veux mettre en cache les données en utilisant les dépendances de cache afin que le cache invalide si les données changent. Toutefois, query notifications de SQL Server ne prennent pas en charge l'expression TOP. Existe-t-il d'autres manières d'interroger un ensemble de données paginé avec LINQ qui ne génère pas de TOP? Ou une autre façon de mettre en cache ces données afin qu'elles soient invalidées?Mise en cache des résultats LINQ paginés sans utiliser Skip() ou Take()

+0

Comment mélanger-vous LINQ et SqlDependency? –

Répondre

1

Tirez vos données en deux passes:

// step1: get the IDs of the items in the current page. 
List<int> customerIds = db.Customers 
    .Where(filter) 
    .OrderBy(c => c.FirstName) 
    .ThenBy(c => c.CustomerID) 
    .Select(c => c.CustomerID) 
    .Skip(200) 
    .Take(20) 
    .ToList(); 

// step2: get the items for that page 
List<Customer> customers = db.Customers 
    .Where(c => customerIds.Contains(c.CustomerID)) 
    .ToList(); 
+0

J'aime cette idée! Il sera invalide lorsqu'un client sur cette page est supprimé ou édité. Toutefois, si vous ajoutez un nouveau client et qu'il modifie les résultats dans cette liste, je ne pense pas qu'une dépendance basée sur la deuxième requête sera invalidée. – Noel

1

Mettez en cache le jeu de résultats complet et définissez le paramètre SqlDependancy sur celui-ci.

Lire l'intégralité de l'ensemble à partir du cache, puis utiliser Ignorer/Prendre ceci.

+0

C'est une bonne solution, mais malheureusement, cela ne fonctionne pas pour moi car l'ensemble de données serait trop volumineux pour être mis en mémoire cache. – Noel

Questions connexes