2010-01-29 12 views
9

Tengo que escribir debajo de 2 declaraciones LINQ. Ambos regresan (aparentemente) el mismo conjunto de resultados. ¿Alguien puede explicarme por qué debería usar una forma versus la otra? ¿Es tan simple como "You say potato, I say potato; you say tomato, I say tomato"?LINQ, ¿DEBO UNIRSE o usar el anidado SELECCIONAR NUEVO?

Éstos son los dos sabores de LINQ ->

1) Los dos lets a continuación han de métodos privados que tengan un ID y devuelve el nombre.

var business = from businesse in context.tblBusinesses 
       where businesse.BusinessID == businessID 
       join addresse in context.tblAddresses on businesse.BusinessID equals addresse.BusinessID 
       let stateName = GetStateNameByID(addresse.StateID) 
       let countyName = GetCountyNameByID(addresse.CountyID) 
       select new 
       { 
        businesse.BusinessName, 
        businesse.ContactName, 
        businesse.EmailAddress, 
        addresse.AddressLine1, 
        addresse.AddressLine2, 
        addresse.AddressLine3, 
        addresse.CityName, 
        State = stateName, 
        addresse.ZipCode, 
        addresse.ZipPlus, 
        County = countyName 
       }; 

2)

var query = from businesse in context.tblBusinesses 
      where businesse.BusinessID == businessID 
      select new 
      { 
       businesse.BusinessName, 
       businesse.ContactName, 
       businesse.EmailAddress, 
       Address = from addresse in businesse.tblAddresses 
          select new 
          { 
           addresse.AddressLine1, 
           addresse.AddressLine2, 
           addresse.AddressLine3, 
           addresse.CityName, 
           State = addresse.StateID, 
           addresse.ZipCode, 
           addresse.ZipPlus, 
           County = addresse.tblAdminCounty 
          } 
      }; 

Respuesta

1

¿Estás seguro de que dan el mismo resultado?

Parece que el primer ejemplo aplanaría su propiedad Address en propiedades múltiples, mientras que su segundo ejemplo tendría una propiedad Address que a su vez contiene propiedades.

Pero, por lo demás, yo diría que la diferencia entre unir y una "selección interna" sería una cuestión de preferencia personal. Probablemente prefiera ir con un join porque estoy acostumbrado a escribir SQL y tener la palabra join hace que tu intento sea obvio. Pero tampoco veo un problema con el uso de una selección interna.

+0

"¿Estás seguro de que dan el mismo resultado?" - Supongo que cuando dije que quise decir que los campos tienen el mismo valor (es decir, estado = CA en ambos) tendré que pensar en ello para comprender si las propiedades hacen una diferencia en cómo los uso para mí. –

6

Cuando ves el generador de perfiles de SQL Server, se ve que el segundo crea muchas consultas pero el primero se lleva todos los datos en una consulta. Entonces, el primero es más eficiente.

+1

Realmente, eso es sorprendente, para mí de todos modos, ya que me estaba inclinando a estar de acuerdo con Jon Skeet. –

+0

¿Estás seguro de eso, @NetSide? – devuxer

+4

Sí, estoy seguro de que para cada empresa crea consultas sql para la dirección. Tuve la experiencia similar. si estoy usando LINQ, siempre mantengo mi profiler sql abierto :) – NetSide