5 Stimmen

Unterschiede zwischen LINQ to Objects und LINQ to SQL-Abfragen

Ich verwende seit einiger Zeit LINQ zur Abfrage meiner POCO-Objekte, aber ich habe LINQ to SQL noch nicht ausprobiert. Ich nehme an, dass LINQ to SQL-Abfragen irgendwie in äquivalente SQL-Abfragen umgewandelt werden, und angesichts dessen frage ich mich, ob sich das auf die Art und Weise auswirkt, wie LINQ to SQL-Abfragen geschrieben werden oder geschrieben werden sollten.

Gibt es wesentliche Unterschiede zwischen LINQ to Objects und LINQ to SQL, die sich auf die Art und Weise auswirken, wie ich eine Abfrage für beide schreiben sollte?

3voto

Jon Skeet Punkte 1325502

Der Hauptunterschied ist, wie Sie sagen, dass LINQ to SQL-Abfragen in SQL konvertiert werden. Das bedeutet, dass Sie Code schreiben können, der eigentlich nicht konvertierbar ist oder eine etwas andere Semantik hat - und das finden Sie erst zur Ausführungszeit heraus.

Zum Beispiel:

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

wird kompilieren gut, scheitern aber zur Ausführungszeit, weil LINQ to SQL nicht weiß, was es mit GetHashCode() .

Grundsätzlich finde ich LINQ to SQL viel schwieriger vorherzusagen als LINQ to Objects. Das heißt nicht, dass es nicht nützlich ist - es ist nur eine etwas andere Welt. MS hat erstaunliche Arbeit geleistet, indem es Ihnen erlaubt hat, Abfragen zu schreiben, die sehr oft tun, was man von ihnen erwartet, aber sie können nicht alles tun.

1voto

Matt Kocaj Punkte 10936

MSDN-Referenz aquí y aquí sollte Ihnen weiterhelfen.

1voto

Amy B Punkte 104656

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

Wenn Sie in linq Objekte gruppieren, erhalten Sie ein hierarchisch aufgebautes Ergebnis (Schlüssel, mit untergeordneten Objekten).

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

Wenn Sie in linq to sql gruppieren und nach den untergeordneten Objekten fragen (mehr als Aggregate), wird linq to sql jede Gruppe mit dem Schlüssel erneut abfragen, um diese untergeordneten Objekte zu erhalten. Wenn Sie Tausende von Gruppen haben, kann das Tausende von Roundtrips bedeuten.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X