vacio - metodos y funciones en c#
Métodos de extensión LINQ-Cualquier() vs. Dónde() versus Existe() (6)
context.Authors.Where (a => a.Books.Any (b => b.BookID == bookID)). ToList ();
a.Books
es la lista de libros de ese autor. La propiedad se crea automáticamente por Linq-to-Sql, siempre que tenga una configuración de relación de clave externa.
Entonces, a.Books.Any(b => b.BookID == bookID)
traduce a "¿ a.Books.Any(b => b.BookID == bookID)
de los libros de este autor tiene una ID de bookID?", Lo que hace que la expresión completa "¿Quiénes son los autores del libro? id ID de libro? "
Eso también podría escribirse algo así como
from a in context.Authors
join b in context.Books on a.AuthorId equal b.AuthorID
where b.BookID == bookID
select a;
ACTUALIZACIÓN: Any()
por lo que sé, solo devuelve un bool
. Su implementación efectiva es:
public Any(this IEnumerable<T> coll, Func<T, bool> predicate)
{
foreach(T t in coll)
{
if (predicte(t))
return true;
}
return false;
}
Desafortunadamente, los nombres de estos métodos hacen términos de búsqueda terribles, y no he podido encontrar un buen recurso que explique la diferencia entre estos métodos, como cuándo usar cada uno.
Gracias.
Editar:
El tipo de consulta que trato de entender completamente es algo como esto:
context.Authors.Where(a => a.Books.Any(b => b.BookID == bookID)).ToList();
Y gracias a todos los que han respondido.
Any () devuelve verdadero si alguno de los elementos de una colección cumple los criterios de su predicado.
Where () devuelve un enumerable de todos los elementos en una colección que cumplen los criterios de su predicado.
Exists () hace lo mismo que cualquiera, excepto que es solo una implementación anterior que estaba allí en el IList antes de Linq.
Cualquiera - función booleana que devuelve verdadero cuando cualquiera de los objetos en la lista cumple la condición establecida en los parámetros de la función. Por ejemplo:
List<string> strings = LoadList();
boolean hasNonEmptyObject = strings.Any(s=>string.IsNullOrEmpty(s));
Where - función que devuelve la lista con todos los objetos en la lista que satisfacen la condición establecida en los parámetros de la función. Por ejemplo:
IEnumerable<string> nonEmptyStrings = strings.Where(s=> !string.IsNullOrEmpty(s));
Existe, básicamente lo mismo que cualquiera, pero no es genérico, está definido en la clase List, mientras que Any está definido en la interfaz IEnumerable.
IEnumerable presenta un buen número de extensiones que le ayudan a pasar su propio delegado e invocar el resultado de IEnumerable. La mayoría de ellos son por naturaleza del tipo Func
El Func toma un argumento T y devuelve TResult.
En caso de
Donde - Func: Entonces toma IEnumerable de T y devuelve un bool. El where finalmente devolverá el IEnumerable de T para el cual Func devuelve verdadero.
Entonces, si tiene 1,5,3,6,7 como IEnumerable y escribe .where (r => r <5), devolverá un nuevo IEnumerable de 1,3.
Cualquiera - Func básicamente es similar en la firma pero devuelve verdadero solo cuando cualquiera de los criterios devuelve verdadero para IEnumerable. En nuestro caso, volverá verdadero ya que hay pocos elementos presentes con r <5.
Existe: el predicado, por otro lado, devuelve verdadero solo cuando cualquiera de los predicados devuelve verdadero. Por lo tanto, en nuestro caso, si aprueba .Exists (r => 5) devolverá true ya que 5 es un elemento presente en IEnumerable.
Para que pueda encontrarlo la próxima vez, así es como busca las extensiones enumerables de Linq. Los métodos son métodos estáticos de Enumerable, por lo tanto Enumerable.Any, Enumerable.Where y Enumerable.Exists.
- google.com/search?q=Enumerable.Any
- google.com/search?q=Enumerable.Where
-
google.com/search?q=Enumerable.Exists
Como el tercero no arroja ningún resultado útil, descubrí que se refería a List.Exists, por lo tanto:
También recomiendo hookedonlinq.com ya que contiene guías muy completas y claras, así como explicaciones claras del comportamiento de los métodos de Linq en relación con el diferimiento y la pereza.
Where
devuelve una nueva secuencia de elementos que coinciden con el predicado.
Any
devuelve un valor booleano; hay una versión con un predicado (en cuyo caso devuelve si los elementos coinciden o no) y una versión sin (en cuyo caso se devuelve si la consulta hasta ahora contiene algún elemento).
No estoy seguro de que Exists
: no es un operador de consultas estándar de LINQ. Si hay una versión para Entity Framework, tal vez verifique la existencia en función de una clave, una especie de forma especializada de Any
. (Existe un método Exists
en List<T>
que es similar a Any(predicate)
pero anterior a LINQ).