2010-01-29 8 views
9

Ich muss unter 2 LINQ Aussagen. Sie geben beide (scheinbar) die gleiche Ergebnismenge zurück. Kann mir jemand erklären, warum ich einen Weg gegen den anderen benutzen sollte? Ist es so einfach wie "You say potato, I say potato; you say tomato, I say tomato"?LINQ, sollte ich oder verschachtelte SELECT NEW's

Hier sind die zwei Arten von LINQ ->

1) Die beiden lets unten an private Methoden sind, die eine ID nehmen und den Namen zurück.

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

Antwort

1

Sind Sie sicher, dass sie dasselbe Ergebnis liefern?

Es sieht so aus, als würde das erste Beispiel Ihre Address -Eigenschaft in mehrere Eigenschaften reduzieren, während Ihr zweites Beispiel eine Address -Eigenschaft hätte, die selbst Eigenschaften enthält.

Aber ansonsten würde ich sagen, der Unterschied zwischen Beitritt und einer "inneren Auswahl" wäre eine Frage der persönlichen Präferenz. Ich würde wahrscheinlich lieber mit einem Join gehen, weil ich gewohnt bin, SQL zu schreiben und das Wort join dort zu haben, macht deine Absicht offensichtlich. Aber ich sehe auch kein Problem mit der Verwendung einer inneren Auswahl.

+0

"Bist du sicher, dass sie dasselbe Ergebnis liefern?" - Ich denke, als ich sagte, dass ich meinte, dass die Felder den gleichen Wert haben (dh Zustand = CA in beiden), muss ich darüber nachdenken, um zu verstehen, ob die Eigenschaften einen Unterschied darin machen, wie ich sie für mich benutze. –

6

Wenn Sie den SQL Server Profiler sehen, sehen Sie, dass der zweite bekommt viele Anfragen, aber die erste erstellt alle Daten in einer Abfrage. Der erste ist also effizienter.

+1

Wirklich, das ist für mich sowieso überraschend, da ich darauf warte, Jon Skeet zuzustimmen. –

+0

Sind Sie sicher, @ NetSide? – devuxer

+4

Ja, ich bin sicher, für jedes Unternehmen erstellt SQL Abfragen für die Adresse. Ich hatte ähnliche Erfahrungen. Wenn ich LINQ verwende, halte ich immer meinen SQL Profiler offen :) – NetSide