2010-10-26 18 views
8

Linq permite expresar uniones internas utilizando la palabra clave join o usando SelectMany() (es decir, un par de palabras clave from) donde palabra clave:Cuándo preferir las combinaciones expresadas con SelectMany() sobre las combinaciones expresadas con la palabra clave join en Linq

var personsToState = from person in persons 
        join state in statesOfUS 
        on person.State equals state.USPS 
        select new { person, State = state.Name }; 
foreach (var item in personsToState) 
{ 
    System.Diagnostics.Debug.WriteLine(item); 
} 

// The same query can be expressed with the query operator SelectMany(), which is 
// expressed as two from clauses and a single where clause connecting the sequences.      
var personsToState2 = from person in persons 
         from state in statesOfUS 
         where person.State == state.USPS 
         select new { person, State = state.Name }; 
foreach (var item in personsToState2) 
{ 
    System.Diagnostics.Debug.WriteLine(item); 
} 

Mi pregunta: ¿cuándo es un propósito de utilizar el estilo de unirse y cuándo usar el estilo, donde, tiene ventajas de rendimiento de un estilo sobre el otro estilo?

Respuesta

6

Para consultas locales Join es más eficiente debido a su consulta de llave como Athari mentioned, sin embargo, para LINQ a SQL (L2S) obtendrá más kilometraje de SelectMany. En L2S, un SelectMany finalmente utiliza algún tipo de combinación SQL en el SQL generado dependiendo de su consulta.

Consulte las preguntas 11 & 12 de the LINQ Quiz de Joseph/Ben Albahari, autores de C# 4.0 In a Nutshell. Muestran muestras de diferentes tipos de uniones y afirman:

Con LINQ a SQL, SelectMany basan- une son los más flexibles, y se pueden realizar tanto equi y no se une a equi. Tirar en DefaultIfEmpty, y usted puede hacer uniones externas izquierdas también!

Además, Matt Warren tiene una entrada de blog detallada sobre este tema en lo que respecta a IQueryable/SQL aquí: LINQ: Building an IQueryable provider - Part VII.

Volver a su pregunta de cuál utilizar, se debe usar en cada consulta es más fácil de leer y le permite expresar fácilmente a sí mismo y construir su objetivo final claro. El rendimiento no debe ser una preocupación inicial a menos que se trate de colecciones grandes y haya perfilado ambos enfoques. En L2S debe tener en cuenta la flexibilidad que SelectMany le ofrece dependiendo de la forma en que necesite emparejar sus datos.

2

unión es más eficiente, que utiliza la clase de búsqueda (una variación del diccionario con varios valores para una sola tecla) para encontrar valores coincidentes.

+0

Ambos métodos son * * eficaz, pero JOIN es probablemente más eficiente * * ... –

+0

@Thomas Levesque Gracias por su corrección, Inglés no es mi lengua materna. – Athari

Cuestiones relacionadas