2010-09-15 7 views
11

¿Cuál es la diferencia entre¿Cuál es la diferencia entre dónde y unirse?

var q_nojoin = from o in one 
       from t in two 
       where o.SomeProperty == t.SomeProperty 
       select new { o, t }; 

y

var q_join = from o in one 
      join t in two on o.SomeProperty equals t.SomeProperty 
      select new { o, t }; 

Me parecen dar los mismos resultados.

+1

Es lo mismo que la combinación implícita vs explícita de SQL. Ambas son combinaciones, pero la segunda es explícita. – spender

+0

Es 'Lo que más le convenga' - Ha vea lo que hice allí – PostMan

Respuesta

14

Ofrecen el mismo resultado, pero la unión es mucho más rápida, a menos que use LINQ to SQL para que la base de datos pueda optimizar las consultas.

Hice una prueba con dos matrices que contenían 5000 elementos cada una, y la consulta con una unión fue aproximadamente 450 veces más rápida (!) Que la consulta sin una unión.

Si usa LINQ to SQL, la base de datos optimizará ambas consultas para hacer el mismo trabajo, por lo que no hay diferencia de rendimiento en ese caso. Sin embargo, una unión explícita se considera más legible.

Si está utilizando LINQ contra una fuente de datos diferente, no existe una capa de optimización, por lo que hay una diferencia significativa en el funcionamiento de las consultas. La unión utiliza una tabla hash o similar para buscar rápidamente los valores coincidentes, mientras que la consulta sin una unión comparará todos los elementos de una tabla con cada elemento de la otra tabla. La complejidad de la unión es aproximadamente O (n + m), mientras que la complejidad de la consulta sin la unión es O (n * m). Esto significa no solo que la consulta sin la unión es más lenta, sino también que escasea mal, de modo que a medida que los datos crecen, se vuelve exponencialmente más lenta.

1

Un JOIN es un medio para combinar campos de dos (o más) tablas mediante el uso de valores comunes para cada uno.

Una cláusula WHERE especifica que una instrucción SQL (lenguaje de manipulación de datos) solo debe afectar a las filas que cumplen los criterios especificados (piense en una cláusula WHERE como un FILTRO).

+0

No responde mi pregunta en absoluto :( –

+0

ah, ¿la semántica de una consulta LINQ es diferente (wrt WHERE y JOIN) de la de una consulta ANSI SQL? –

+0

Seguramente, incluso en una consulta SQL esto no responde la pregunta. Usted dice "A JOIN es un medio para combinar campos de dos tablas", pero seguramente también lo es 'de a, b donde a.Field = b.Field', por lo que no responde la pregunta de cuál es la diferencia. – Timwi

0

En la práctica, dependiendo de muchos otros factores, puede obtener mejoras de rendimiento al usar una sobre otra. Me imagino (aunque de hecho no tengo ninguna base para esto) que las uniones son más sargables que las cláusulas WHERE.

corregir: resulta que estoy totalmente equivocado. No debería haber ninguna diferencia en el rendimiento entre los dos tipos. Sin embargo, el estilo más nuevo (utilizando JOIN) es mucho más claro de leer (imo) y, además, Microsoft ha dicho que no admitirá indefinidamente el estilo anterior (external-join using WHERE).

0

En realidad en SQL, join-on declaraciones se pueden escribir en from-where declaraciones (si realmente desea). Pero usted sabe que tenemos left joinleft outer join y etc en declaraciones SQL, que nos hacen más fáciles de expresar lo que queremos (por supuesto, también puede usar from-where pero hará que su código parezca una locura). Por lo tanto, siempre utilizamos where si queremos filtrar nuestro resultado, mientras usamos join si hay una relación entre tablas.

0

La primera consulta está diciendo, en efecto, "Haz una combinación cruzada en estas colecciones (creando essensially una matriz N x M), a continuación, sólo aquellos que están a lo largo de la diagonal tomar, y Dámelas"

El La segunda consulta es, en efecto, "Crear una lista de solo los elementos combinados donde coinciden las proezas".

Los resultados son los mismos, pero el proceso de llegar es un poco diferente.

Dado que las bases de datos SQL generalmente están muy optimizadas, por lo tanto, cuando solicita la primera, el servidor simplemente dice "Usuario idiota ...", y sustituye a la segunda.

En entornos que no sean SQL (como Linq-to-Objects), si solicita el primero, eso es lo que hará, y verá un golpe de rendimiento significativo.

Cuestiones relacionadas