2012-04-10 7 views
6

Me encontré con el siguiente código y no sé qué significa tener de significa dos veces en este código. ¿Significa que hay una unión entre Libros y CSBooks?¿usar "de" más de una vez es equivalente a tener una unión?

List<Product> Books = new List<Product>(); 
      List<Product> CSBooks = new List<Product>(); 
      var AllBooks = from Bk in Books 
          from CsBk in CSBooks 
          where Bk != CsBk 
          select new[] { Bk, CsBk }; 

Respuesta

13

Es algo así como una unión. Cuando uno dice:

from customer in customers 
join order in orders on customer.Id equals order.CustomerId 
select whatever 

que es esencialmente una forma más eficiente de la escritura:

from customer in customers 
from order in orders 
where customer.Id == order.CustomerId 
select whatever 

¿Ves por qué? El primero dice "hey query processor, los clientes y los pedidos tienen una relación especial que se define por la igualdad de la identificación del cliente y la identificación del cliente almacenada en un pedido". El segundo dice "dame el producto cartesiano, todas las combinaciones posibles de clientes y pedidos, y luego filtra los que no tienen sentido". Tienen el mismo efecto, pero el primero es más eficiente.

Sin embargo, puede utilizar varias cláusulas "de" para hacer cosas que son más sofisticadas que solo los productos cartesianos. Supongamos que un cliente puede tener más de una dirección:

from customer in customers 
from address in customer.Addresses 
select address 

múltiple from cláusulas son en realidad un "seleccione muchos". Es decir, toman una secuencia, y una forma de hacer secuencias de cada elemento de la primera secuencia, y fusionan todas las secuencias resultantes juntas.

El "seleccionar muchos" es simple pero extremadamente poderoso; Ya hemos visto que puede usar "seleccionar muchos" para realizar una operación de unión (lenta, pero correcta). De hecho, puede usar seleccionar muchos para hacer todas las consultas posibles si es lo suficientemente inteligente y no le importa perder mucho tiempo y memoria. Por ejemplo:

from customer in customers 
where customer.City == "London" 
select customer 

se podría escribir sin "donde" de esta manera:

from customer in customers 
from c in (customer.City == "London" ? 
       new Customer[] {customer} : 
       new Customer[] { }) 
select c; 

que sería una locura hacerlo, pero where y join esté innecesaria - que son sólo formas más rápidas, más cortas y más eficientes de escribir un seleccionar muchos.

3

from dos veces es el producto cruzado. Eso es todas las combinaciones de Books y CSBooks

2

Es más bien lo opuesto a una unión. Creo que el resultado de eso sería en realidad un producto cartesiano. Es decir, debido a !=, unirá cada elemento del primer conjunto en cada elemento del segundo conjunto que NO es igual al primer elemento.

Cuestiones relacionadas