2009-09-01 15 views
27

Quiero filtrar mis resultados para tomar solo la cantidad X de registros. Me pregunto cómo funciona Take()?Pregunta de Linq Take()

En este sitio que encontré: http://www.hookedonlinq.com/TakeOperator.ashx

Se dice Take() "se emite una ArgumentNullException si la fuente es nulo." ¿Entonces qué debo hacer? No puedo garantizar que cada vez que haga un Take() tenga algunos registros en esa tabla o no.

Entonces, ¿primero tengo que hacer un conteo? Luego, haga otra consulta para asegurarse de que hay algunos registros para tomar?

¿Qué sucede si tengo un Take (2) pero solo 1 registro arrojará esta misma excepción?

Respuesta

42

Hay una diferencia entre una referencia nula y una colección vacía. Está bien llamar a Take en una colección vacía. Y el argumento especifica un número máximo para tomar, por lo que también está bien especificar más que hay elementos en la colección.

Recomiendo consultar MSDN para obtener detalles como este.

Para LINQ a Objetos: http://msdn.microsoft.com/en-us/library/bb503062.aspx

para el enlace a las bases de datos: http://msdn.microsoft.com/en-us/library/bb300906.aspx

+0

¿Hay lejos para que sea tomar todos los resultados o limitar el número de resultados? Al igual que solo dependiendo de ciertas condiciones, quiero limitar el número de resultados o tendré que dividir esto (es decir, a diferentes métodos)? – chobo2

+1

@ chobo2: Eso es exactamente lo que hace. Si solicita 5 elementos pero solo tiene 3, obtendrá los 3. –

9

Eso nulo excepción de referencia es sólo si usted está haciendo que en un origen de objeto como:

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

Cuando está haciendo Linq a SQL, devolverá un enumerador VACÍO de sus datos, no una referencia nula. En el mismo token, si está intentando tomar más de lo que está disponible, solo tomará la cantidad disponible. Utilizo este método para enviar datos en algunas instancias y definitivamente muchas veces cuando solicito más registros de los que la lista tiene disponibles.

+0

Llamar a cualquier método en 'null' arrojará una NullReferenceException. ArgumentNullException se lanzará si invoca a Take como método estático: 'List list = null; Enumerable.Take (list, 5); ' – knittl

2

Take a través de una excepción si el objeto que lo invoca es nulo. Lo más probable es que no tenga un objeto nulo, y tener ninguna o menos filas no es lo mismo (estoy seguro de que comprende la semántica).

Si está utilizando un LINQ al contexto de SQL y consulta a la manera de

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

en el caso de los Where regresan cero resultados, no obtendrá una excepción nula, debido a que su consulta no tiene todavía ha sido ejecutado, entonces en el caso de que solo contenga 1 resultado, terminará obteniendo solo 1 resultado. Take limita la cantidad de registros devueltos.

+0

" en el caso de Donde devuelve cero resultados, no obtendrá una excepción nula, porque su consulta aún no se ha ejecutado "- No.No obtendrá una excepción nula porque si 'Where' no arroja ningún resultado, devuelve una referencia no nula a un objeto que representa una secuencia vacía. –

0

contar el número de elementos antes de tomar():

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

Esto no es necesario. De la [documentación] (https://msdn.microsoft.com/en-us/library/bb503062 (v = vs.110) .aspx): "' Tome 'enumera' fuente' y cede elementos hasta 'contar' los elementos han sido cedidos o 'fuente' no contiene más elementos. Si' count' excede la cantidad de elementos en 'source', se devuelven todos los elementos de' source'. –

Cuestiones relacionadas