2009-11-11 14 views
5

Ich habe LINQ verwendet, um meine POCO-Objekte für einige Zeit abzufragen, aber ich habe LINQ to SQL noch nicht versucht. Ich gehe davon aus, dass LINQ to SQL-Abfragen irgendwie in äquivalente SQL-Abfragen konvertiert werden, und angesichts dessen frage ich mich, ob dies die Art beeinflusst, wie LINQ zu SQL-Abfragen geschrieben werden oder geschrieben werden sollten.Unterschiede zwischen LINQ zu Objects und LINQ zu SQL-Abfragen

Gibt es signifikante Unterschiede zwischen LINQ to Objects und LINQ to SQL, die beeinflussen, wie ich eine Abfrage für beide schreiben sollte?

+0

siehe auch http://stackoverflow.com/questions/2388022/case-insensitive-string-compare-with-linq-to-sql-and-linq-to-objects –

Antwort

3

Der Hauptunterschied ist, wie Sie sagen, LINQ to SQL-Abfragen werden in SQL konvertiert. Das bedeutet, dass es Code gibt, den Sie schreiben können, der nicht wirklich konvertierbar ist oder eine subtil unterschiedliche Semantik hat - und Sie finden das nur zur Ausführungszeit heraus.

Zum Beispiel:

var query = from person in people 
      where person.Age == person.GetHashCode() 
      select person; 

wird kompilieren in Ordnung, aber zum Zeitpunkt der Ausführung scheitern, weil LINQ to SQL nicht weiß, was mit GetHashCode() zu tun.

Grundsätzlich finde ich LINQ to SQL viel schwieriger zu prognostizieren als LINQ to Objects. Das heißt nicht, dass es nicht nützlich ist - es ist nur eine etwas andere Welt. MS hat eine erstaunliche Arbeit geleistet, um Ihnen Fragen zu schreiben, die sehr oft tun, was Sie von ihnen erwarten, aber es kann nicht alles tun.

2

LINQ to SQL verwendet die Sortierung des Spalten-DB-Servers für Where und OrderBy. LINQ to Objects verwendet Zeichenfolgenvergleiche. Bei der ersten Option kann die Groß-/Kleinschreibung nicht beachtet werden, bei der zweiten dagegen die Groß-/Kleinschreibung. LINQ to Entities vereinigt Nullen. Ich nehme an, L2S macht das gleiche, aber ich habe es nicht getestet. So in L2E Sie tun können:

let foo = item.Property.SomeNullableType 

... und foo wird null sein, wenn Eigenschaft null ist. Aber in LINQ to Objects würde man so etwas zu tun haben:

let foo = item.Property != null ? item.Property.SomeNullableType : null 

... oder würden Sie eine Null-Exception.

+1

Ja, LinqToSql auch nulls verschmilzt . –

1

MSDN Referenz here und here sollte Ihnen helfen.

1

Ein Unterschied, auf den ich stoße, sind Unterschiede in der Gruppierung.

Wenn Sie linq zu Objekten gruppieren, erhalten Sie ein hierarchisch geformtes Ergebnis (Schlüssel mit untergeordneten Objekten).

Wenn Sie in SQL gruppieren, erhalten Sie nur Schlüssel und Aggregate.

Wenn Sie in linq zu sql gruppieren, wenn Sie nach den untergeordneten Objekten (mehr als aggregates) fragen, wird linq to sql jede Gruppe mit dem Schlüssel neu abfragen, um diese untergeordneten Objekte zu erhalten. Wenn Sie Tausende von Gruppen haben, können das Tausende von Rundreisen sein.

//this is ok 
var results = db.Orders 
    .GroupBy(o => o.CustomerID) 
    .Select(g => new 
    { 
    CustomerId = g.Key, 
    OrderCount = g.Count() 
    }); 

//this could be a lot of round trips. 
var results = db.Orders 
    .GroupBy(o => o.CustomerID) 
    .Select(g => new 
    { 
    CustomerId = g.Key, 
    OrderIds = g.Select(o => o.OrderId) 
    }); 

// this is ok 
// used ToList to separate linqtosql work from linqtoObject work 
var results = db.Orders 
    .Select(o => new {o.CustomerId, o.OrderId}) 
    .ToList() 
    .GroupBy(o => o.CustomerId) 
    .Select(g => new 
    { 
    CustomerId = g.Key, 
    OrderIds = g.Select(o => o.OrderId) 
    });