2009-09-01 6 views
27

Je veux filtrer mes résultats pour ne prendre que le nombre X d'enregistrements. Je me demande comment fonctionne Take()?Linq Take() question

Sur ce site, j'ai trouvé: http://www.hookedonlinq.com/TakeOperator.ashx

Il dit Take() "lève une ArgumentNullException si la source est nulle." Donc qu'est ce que je devrais faire? Je ne peux pas garantir qu'à chaque fois que je fais un Take() j'aurai des enregistrements dans cette table ou non.

Alors dois-je d'abord faire un compte? Puis faire une autre requête pour s'assurer qu'il y a des enregistrements à saisir?

Également ce qui se passe si j'ai un Take (2) mais seulement 1 enregistrement lancera-t-il cette même exception?

Répondre

42

Il existe une différence entre une référence nulle et une collection vide. Il est bon d'appeler Prendre une collection vide. Et l'argument spécifie un nombre maximum à prendre, donc c'est aussi bien de spécifier plus que des éléments dans la collection.

Je recommande de faire référence à MSDN pour des détails précis comme celui-ci.

Pour LINQ to Objects: http://msdn.microsoft.com/en-us/library/bb503062.aspx

Pour Lien vers les bases de données: http://msdn.microsoft.com/en-us/library/bb300906.aspx

+0

est-il loin d'en faire prendre tous les résultats ou limiter le nombre de résultats? Comme seulement en fonction de certaines conditions, je veux limiter le nombre de résultats ou dois-je séparer cela (c'est-à-dire à différentes méthodes)? – chobo2

+1

@ chobo2: C'est exactement ce qu'il fait déjà. Si vous demandez 5 items mais seulement 3, cela vous donnera tous les trois. –

9

Ce null exception de référence est que si vous faites cela contre une source d'objets tels que:

List<MyObject> myList = null; 
myList.Take(5); // this would produce the error, of course 

Lorsque vous faites Linq to SQL cela retournera un énumérateur VIDE de vos données, pas une référence nulle. Du même coup, si vous essayez de prendre plus que ce qui est disponible, cela ne prendra que le montant disponible. J'utilise cette méthode pour faire des pages de données dans certains cas et certainement beaucoup de temps quand je vais demander plus d'enregistrements que la liste est disponible.

+0

Appeler n'importe quelle méthode sur 'null' va lancer une exception NullReferenceException. ArgumentNullException sera levée si vous invoquez Take en tant que méthode statique: 'Liste list = null; Enumerable.Take (list, 5); ' – knittl

2

Prendra will à travers une exception si l'objet qui l'appelle est nul. Les chances sont que vous n'aurez pas d'objet nul, et ne pas avoir de lignes ou moins n'est pas la même chose (je suis sûr que vous comprenez la sémantique).

Si vous utilisez un Linq au contexte SQL et l'interrogation de la façon de

Context.MyTable.Where(x => x.ID > 0).Take(2); 

dans le cas des Where de retour aucun résultat, vous ne recevrez pas une exception nulle, parce que votre requête n'a pas encore été exécuté, alors dans le cas où celui-ci ne contient que 1 résultat, vous n'obtiendrez qu '1 résultat en retour. Take limite la quantité de retours d'enregistrements.

+0

" dans le cas des résultats Où retourner zéro, vous ne recevrez pas une exception nulle, car votre requête n'a pas encore été exécutée "- No.Vous n'obtiendrez pas une exception nulle car si 'Where' ne renvoie aucun résultat, il renvoie une référence non nulle à un objet représentant une séquence vide. –

0

Compter le nombre d'éléments avant de prendre():

List<string> a = new List<string>(); 
      int count = a.Count > 12 ? 12 : a.Count; 
      a.Take(count); 
+0

Ceci est inutile. De la [documentation] (https://msdn.microsoft.com/en-us/library/bb503062 (v = vs.110) .aspx): «' Take 'énumère' source' et donne des éléments jusqu'à 'count' Si 'count' dépasse le nombre d'éléments dans' source', tous les éléments de 'source' sont retournés." –