2010-01-29 12 views
9

Devo essere al di sotto di 2 istruzioni LINQ. Entrambi restituiscono (apparentemente) lo stesso set di risultati. Qualcuno può spiegarmi perché dovrei usare l'una contro l'altra? È semplice come "You say potato, I say potato; you say tomato, I say tomato"?LINQ, Dovrei partecipare o utilizzare nidificato SELECT NEW

Ecco i due sapori di LINQ ->

1) I due lets qui sotto sono a metodi privati ​​che prendono un ID e restituire il nome.

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 
          } 
      }; 

risposta

1

Sei sicuro che danno lo stesso risultato?

Sembra che il primo esempio appiattisca la proprietà Address in più proprietà, mentre il secondo esempio avrà una proprietà Address che contiene proprietà.

In caso contrario, direi che la differenza tra l'adesione e una "selezione interna" sarebbe una questione di preferenza personale. Probabilmente preferirei andare con un join perché sono abituato a scrivere SQL e avere la parola join rende evidente il tuo intento. Ma non vedo un problema con l'utilizzo di una selezione interna, neanche.

+0

"Sei sicuro che danno lo stesso risultato?" - Immagino che quando ho detto che intendevo che i campi hanno lo stesso valore (es. State = CA in entrambi), dovrò pensarci su per capire se le proprietà fanno la differenza nel modo in cui le uso per me. –

6

Quando si guarda il profiler di SQL Server, si vede che la seconda crea molte query, ma il primo ottiene tutti i dati in una query. Quindi il primo è più efficiente.

+1

Davvero, questo è sorprendente, per me comunque, dato che ero propenso ad accordarmi con Jon Skeet. –

+0

Ne sei sicuro, @ NetSide? – devuxer

+4

Sì, sono sicuro, per ogni azienda crea query SQL per l'indirizzo. Ho avuto l'esperienza simile. se sto usando LINQ, tengo sempre aperto il mio profiler sql :) – NetSide

Problemi correlati