Existe-t-il un moyen d'obtenir le nombre total lorsque vous utilisez l'opérateur Take?Utilisation de Count avec Take avec LINQ
Répondre
Vous pouvez faire les deux. Il suffit d'exécuter le compte avant la prise. cela provoquera l'exécution de la requête deux fois, mais je crois que c'est inévitable. Si cela est dans un contexte Linq2SQL, comme votre commentaire l'indique, cela demandera en fait deux fois la base de données. En ce qui concerne le chargement paresseux, cela dépendra de la façon dont le résultat de la requête est réellement utilisé.
Par exemple: si vous avez deux tables et dire Product
ProductVersion
où chaque Product
a plusieurs ProductVersions
associés via une clé étrangère.
si ceci est votre requête:
var query = db.Products.Where(p => complicated condition).OrderBy(p => p.Name).ThenBy(...).Select(p => p);
où vous suffit alors de sélectionner Products
mais après l'exécution de la requête:
var results = query.ToList();//forces query execution
results[0].ProductVersions;//<-- Lazy loading occurs
si vous faites référence à une clé étrangère ou objet connexe qui ne faisait pas partie la requête d'origine sera alors chargée paresseuse. Dans votre cas, le compte ne provoquera pas de chargement paresseux car il renvoie simplement un int. mais en fonction de ce que vous faites réellement avec le résultat du Take()
vous pouvez ou non avoir un chargement paresseux. Parfois, il peut être difficile de savoir si vous avez LazyLoading en cours, pour vérifier que vous devriez enregistrer vos requêtes en utilisant la propriété DataContext.Log
.
La meilleure façon serait de faire juste un Count
de la requête, puis effectuez Take
:
var q = ...;
var count = q.Count();
var result = q.Take(...);
Il est possible de le faire dans une seule requête Linq-to-SQL (où une seule instruction SQL sera exécutée). Le code SQL généré semble désagréable, donc vos performances peuvent varier.
Si ceci est votre requête:
IQueryable<Person> yourQuery = People
.Where(x => /* complicated query .. */);
Vous pouvez ajouter ce qui suit à ce:
var result = yourQuery
.GroupBy (x => true) // This will match all of the rows from your query ..
.Select (g => new {
// .. so 'g', the group, will then contain all of the rows from your query.
CountAll = g.Count(),
TakeFive = g.Take(5),
// We could also query for a max value.
MaxAgeFromAll = g.Max(x => x.PersonAge)
})
.FirstOrDefault();
Ce qui vous permettra d'accéder à vos données comme ceci:
// Check that result is not null before access.
// If there are no records to find, then 'result' will return null (because of the grouping)
if(result != null) {
var count = result.CountAll;
var firstFiveRows = result.TakeFive;
var maxPersonAge = result.MaxAgeFromAll;
}
- 1. LINQ Join (Left Outer) avec Take (1)
- 2. Utilisation LINQ avec XML
- 3. Linq Take() question
- 4. Linq sur DataTable avec .Skip() et la méthode .Take()
- 5. COUNT (1) OVER() avec Linq to Sql
- 6. Utilisation de IQueryable avec Linq
- 7. Utilisation de Linq avec WCF
- 8. Linq2Entities Inclure avec Skip/Take-load problème
- 9. Utilisation d'un formulaire avec LINQ
- 10. Utilisation de mysql COUNT (*)
- 11. Utilisation de Linq avec des procédures stockées
- 12. Utilisation de LINQ to SQL avec Oracle
- 13. Utilisation de LINQ avec IBM i
- 14. Linq avec Left Rejoindre sur SubQuery contenant Count
- 15. LINQ et .COUNT expirer
- 16. COUNT avec DATE INTERVALLE
- 17. lignes en double lors de l'utilisation orderby, Skip() et Take() avec LINQ
- 18. Utilisation d'une instruction LINQ avec différents paramètres
- 19. C# Linq eqiuvalent de SQL Count()
- 20. Est-ce que LINQ skip & take a des performances décentes?
- 21. Comment convertir une instruction SQL avec TOP, COUNT et GROUP BY pour renvoyer une liste d'objets avec LINQ
- 22. LINQ SELECT COUNT (*) ET EmployeeId
- 23. Dynamic LINQ to Entity Count()
- 24. Count Distinct avec rétention NULL
- 25. Utilisation de LINQ avec la version express de Visual Studio
- 26. Utilisation de LINQ to SQL avec plusieurs bases de données
- 27. La méthode LINQ et l'ordre d'utiliser OrderBy(), Take(), et ToList()
- 28. Utilisation de Linq-to-XML pour insérer, avec thread
- 29. Utilisation de LINQ avec des classes implémentant ICollection non générique
- 30. Utilisation de requêtes SQL personnalisées avec LINQ to SQL ... Aide
si cette question est spécifiquement à propos de linq2sql vous devez étiqueter votre question en tant que telle. – luke