Vous venez de passer de Subsonic 2.2 ActiveRecord à 3.0.0.3. Je suis en train d'utiliser LINQ pour faire une paginée Trouver requête comme ceci (mon objet/table est appelée « dépôt »):Subsonic 3.0.0.3 Paging SQL en utilisant Linq
Repository.Find(item => item.DocumentTitle.Contains(searchTerm))
.OrderBy(i => i.DocumentTitle).Skip((currentPage - 1) * itemsPerPage)
.Take(itemsPerPage);
Quand je considère le SQL généré par cette requête en utilisant SQL Server Profiler, il n'y a paging dans le SQL, toute la pagination se fait en mémoire en C#. Maintenant, le langage de requête Subsonic a une belle procédure GetPaged qui fonctionne bien, mais je pensais que LINQ était supposé faire cela aussi. Ai-je manqué quelque chose ici ou est-ce une limitation de LINQ?
Je suis conscient de la fonction Repository.GetPaged()
, mais cela n'a pas assez de paramètres - je dois faire un tri dynamique, ainsi qu'un Find()
.
A fait encore plus de recherches. Apparemment, cela est dû à la façon dont C# compile une expression linq. Le compilateur doit savoir au moment du design ce que l'instruction va être. Si ce n'est pas le cas, l'instruction ne peut pas être reflétée par le "ExpressionVisitor" de SubSonic (ce n'est pas propre à SubSonic) car il ne s'agit plus d'une seule "Expression". – Steve
Il existe des bibliothèques tierces qui vous permettent de construire votre instruction linq en plusieurs étapes, mais cela ajoute plus de dépendances externes à votre projet. SubSonic semble déjà avoir certaines de ces fonctions, mais je n'en sais pas assez pour le moment, alors suggérez un moyen de les utiliser pour y parvenir. – Steve