2010-09-23 5 views

Antwort

18

Sie können LINQ for NHibernate Beispiele überprüfen, um zu sehen, Tests von Ayende selbst durchgeführt, was implementiert ist und was nicht für diesen Anbieter ist.

Einige dieser allgemein unterstützt:

  • Anonym Art Schöpfung. new { Person = x.Name }
  • Zuerst(). query.First()
  • FirstOrDefault(). query.FirstOrDefault()
  • Einzel(). query.Single()
  • SingleOrDefault(). query.SingleOrDefault()
  • Aggregat(). query.Aggregate((x1,x2) => x1)
  • Contains(). query.Where(x => x.Name.Contains("Foo"))
  • StartsWith().
  • EndsWith().
  • Teilzeichenfolge(). where db.Methods.Substring(e.FirstName, 1, 2) == "An"
  • Sub-Abfragen. query.Where(x => x.Company.Id == 4)
  • Anzahl(). query.Where(x => x.Relatives.Count > 0)
  • Beliebige().query.Any()
  • Take(). query.Take(10)
  • Überspringen(). query.Take(10).Skip(4)
  • OrderBy(). orderby x.Name descending
  • Ersetzen(). AfterMethod = e.FirstName.Replace("An", "Zan"),
  • CharIndex(). where db.Methods.CharIndex(e.FirstName, 'A') == 1
  • IndexOf(). where e.FirstName.IndexOf("An") == 1

Problematische:

  • Gruppe von
  • tritt

Einer meiner eigenen Beispiele:

query = NSession.Session.Linq<Catalog>() 
      .Where(acc => acc.Company.Status == "A") 
     .Where(acc => acc.Id.StartsWith("12-536")) 
     .Where(acc => acc.Id.EndsWith("92") || acc.Id.EndsWith("67")) 
     .Take(10).OrderBy(acc => acc.Title); 

Wenn Sie Produktionsanwendung sind die neueste mit Stabiler Build 2.1.2.4 wie ich bin, du bist stecken mit dem, was der NHibernate.Linq-Provider uns gibt, bis NHibernate 3.0 (trunk) eine stabile Version erhält und wir uns sicher genug fühlen, um es auf Hauptanwendungen zu verwenden. Bis dahin bin ich mehr als glücklich mit einer Mischung aus NHibernate.Linq und HQL.

+1

Gute Antwort + Abstimmung! Beachten Sie, dass der NHibernate-Trunk für alle in der vorherigen Version implementierten Funktionen stabil ist. Die Probleme sind einige alte Probleme und Probleme in neuen Funktionen. Der linq-Provider im Stamm ist stabiler als der andere. Viele Leute nutzen den Kofferraum bereits in laufenden Großanwendungen. – Paco

+0

Die stabile Version scheint alle Aggregate zu unterstützen. Zum Beispiel benutze ich MAX und es übersetzt den ganzen Weg bis zur DB und wird dort ausgeführt. Beachten Sie, dass bei Verwendung von VB.NET ein kleiner Fehler bei Zeichenfolgenvergleichen auftritt. Ich habe das auf die harte Tour herausgefunden. Benutze myStr.Equals ("foo") statt mystr = "foo" und es funktioniert einfach gut. Kein Problem, wenn C# verwendet wird. – Bytemaster

+0

@ Paco: gut zu wissen. Ich werde versuchen, eine meiner Apps in den NH-Trunk zu verschieben und zu sehen, wie es funktioniert (natürlich in einer Testumgebung). – rebelliard

3

Der grundlegende Test, ob NHibernate mit einer Linq-Anweisung arbeiten kann, besteht darin, ob Sie die Ausdrucksbaumstruktur dieser Anweisung serialisieren, dann in einem anderen Prozess deserialisieren und die richtige Antwort erhalten können. Das bedeutet keine externen Schließungen; Das Lambda muss nur mit dem funktionieren, was es erzeugt oder als Parameter angegeben wird.

Linq2NH 1.0, IIRC, Drosseln auch bei Verwendung von Membern der Klasse, die nicht zugeordnet sind. Wenn Sie z. B. eine schreibgeschützte berechnete Eigenschaft wie einen speziellen gewichteten oder rollenden Durchschnitt haben, müssen Sie sie a zuordnen DB-Spalte, um sie im Lambda zu referenzieren (oder die Logik im Lambda neu zu erstellen). Dies liegt daran, dass der Ausdrucksbaum schließlich in SQL (über eine der NH-Zwischenstufen; in 2.x ist es ICriteria, in 3.x ist es HQL) und wenn NH keinen Ausdruck nehmen und 1: 1 in SQL umwandeln kann Ausdruck, der erfolgreich bewertet wird, es wird einfach nicht funktionieren.

Es gibt einen speziellen Fall: Linq2NH, IIRC, ist intelligent genug, um einen IList.Contains() - Ausdruck in eine IN-Klausel umzuwandeln. Die Liste muss innerhalb des Lambda definiert sein (zB new[]{"1","2"}.Contains(m.ID)).

+0

Sehr gute Antwort, nur eine Korrektur - die Art, wie Sie es in 3.x formuliert haben, dass es über HQL geht, klingt wie Sie sagen, dass die LINQ-Abfrage zuerst in eine HQL-Zeichenfolge umgewandelt wird. Was passiert, ist der Ausdruck Baum wird wieder in die gleichen ASTs, die der HQL ANTLR Parser Ziele analysiert. Dies ist viel effizienter als das Targeting einer Zeichenfolge;) http://blogs.imeta.de/sstrong/archive/2009/02/22/617.aspx –

3

Der Blogpost von Ayende ist von Mai dieses Jahres. Viele Dinge haben sich geändert. Das NHiberante. Linq 1.0 linq provider ist seit etwa einem Jahr wegen des neuen Linq-Providers im NHibernate Trunk veraltet. Der neue linq-Provider ist noch nicht komplett fertig, aber schon jetzt für viele mehr als der alte linq-Provider komplett und nutzbar. Dinge, die nicht mit dem neuen linq-Provider funktionieren, werden als Fehler betrachtet und werden eines Tages behoben, wenn sie gemeldet werden.

Sie können überspringen und mit dem alten und neuen Linq-Anbieter verwenden. Die aktuelle Liste bekannter Probleme finden Sie unter NHibernate Jira. Andere Probleme sind unbekannt und alle anderen Funktionen werden bereits unterstützt.