2010-02-10 25 views
5

Aquí hay dos clases de C# ...¿Qué hace esta consulta LINQ?

public class Address 
{ 
    public string Country; 
    public string City; 
} 

public class Traveller 
{  
    public string Name; 
    public List<Address> TravelRoute; 
} 

... y una lista de datos (llenas en alguna parte) ...

List<Traveller> Travellers; 

... y entonces esta consulta LINQ:

var result = from t in Travellers 
      where t.TravelRoute.Any(a => a.Country == "F") 
      select t; 

foreach (var t in result) 
    System.Console.WriteLine(t.Name); 

No entiendo la consulta: ¿Qué significa la función "Cualquiera" y qué hace el operador "=>"?

¿Alguien me puede explicar lo que está pasando en este código? ¡Gracias!

Respuesta

1

La línea

 
a => a.Country == "F" 

se traduciría en algo como esto si era una declaración de LINQ separados:

 
From a as Adress in t.TravelRoute 
Where a.Country = "F" 
Select a 

La cualquier significa que: Alguna. En otras palabras, devolverá verdadero si cualquiera de los objetos en Travelroute tiene su propiedad País a "F"

Espero que ayude

+0

Entonces, ¿significa que esta "expresión lambda" es solo una abreviación de otra consulta LINQ "anidada"? ¿Solo algo para escribir código más compacto? – Slauma

+0

La expresión lambda, también conocida como expresión en línea, generalmente se escribe para una función única y suele ser más compacta. No tiene que especificar un tipo para el argumento, ya que lo deducirá. Yo digo que sí, puedes reemplazarlo con un LINQ anidado, pero no conozco lo suficiente a LINQ como para decir que escribir el LINQ que escribí en otro LINQ funcionará así. –

+0

Para ser más exactos, la expresión lambda también se puede traducir a un árbol de expresiones que el proveedor de LINQ utiliza para traducir a otro código, como una expresión SQL. –

7

Selecciona a todos los viajeros cuyo TravelRoute contiene un país que es "F".

La función Any devuelve verdadero si alguno de los objetos en la lista satisface la condición que se transfiere a la función. Desde la firma del método, puede ver que toma un delegado Func<> que devuelve un bool. Esto significa que toma cualquier método que devuelva un valor booleano, incluida la expresión lambda suministrada.

Esto es diferente de Where, que filtrará de acuerdo con la condición de que se pasa en.

El => es una lambda expression. En este caso particular, es un atajo para escribir un anonymous delegate.

+3

Probablemente vale la pena señalar que 'Any' es una contrapartida a' all' ; 'All' devuelve verdadero cuando * cada * elemento de la colección satisface la condición (esencialmente una cadena larga de declaraciones' y') y cortocircuitos a 'falso' en una falla, mientras que' Any' devuelve verdadero cuando * any * elements de la colección satisface la condición (esencialmente una cadena larga de declaraciones 'o') y cortocircuitos a' verdadero' en un pase. –

+0

No creo que esto se exprese correctamente.La palabra clave 'donde' selecciona cualquier objeto que satisfaga la condición, en este caso la condición es que debe haber al menos un TravelRoute para el cual el predicado devuelve verdadero. Creo que es importante notar la diferencia. –

+0

Gracias Adam, ¡esta explicación de "Cualquiera" fue bastante clara! – Slauma

0

Cualquiera es un método de filtro que dice "Aceptar cualquier elemento que cumpla con los siguientes criterios". El a => ... negocio significa "Dado un parámetro a, aquí hay un método" - como han dicho otros, se usa para expresiones lambda. Editar: se ha cambiado "propiedad" a "parámetro"

+0

¿Cómo puede el compilador saber de qué tipo es el parámetro a? El tipo no se especifica, solo hay un. Pero incluso recibo Intellisense, que me ofrece el país miembro. Es bueno y correcto, pero difícil de entender ... – Slauma

+0

La expresión Lambda suele ser críptica en su sintaxis, pero pequeña y eficiente. –

+0

El compilador a menudo puede inferir el tipo de acuerdo con la forma en que lo está utilizando. En este caso, la firma de la función Any() requiere un parámetro de tipo Func , lo que significa que quiere una función que acepte una cadena y devuelva un bool, una función de filtro estándar. Así es como el compilador sabe cómo tratar el lambda, y si usted escribió el lambda para devolver un int, por ejemplo, obtendría un error de compilación. – expedient

Cuestiones relacionadas