Ich versuche, NHibernate.LINQ 1.0 zu bewerten, ohne tatsächlich Code zu schreiben. Ayende hat zugegeben, dass this version of LINQ support is subpar compared to EF, aber für das Leben von mir kann ich nicht scheinen, eine Seite zu finden, die erklärt, was in dieser Implementierung unterstützt und nicht unterstützt wird. Zum Beispiel kann ich Skip
& Take
verwenden? Was kann ich nicht verwenden?NHibernate.LINQ unterstützte Operatoren
Antwort
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.
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)
).
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 –
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.
- 1. NHibernate.Linq LockMode
- 2. NHibernate.Linq Und CompareTo String
- 3. Filtering Einheiten von Subtyp mit NHibernate.Linq
- 4. NHibernate.Linq -> Die Methode CompareTo nicht
- 5. Unterstützte Serialisierungstypen
- 6. Links assoziative Operatoren vs rechten assoziative Operatoren
- 7. Fehler "Keine Persister für" mit NHibernate, NHibernate.Linq und Fluent Mapping
- 8. Operatoren Auswertung
- 9. && = und || = Operatoren
- 10. Nicht unterstützte Methode: GradleProject.getBuildScript()
- 11. unterstützte Typen in Funktionen
- 12. Layer-unterstützte Ansichten aktivieren?
- 13. Nicht unterstützte Operandentypfehler
- 14. AFNetworking - Nicht unterstützte URL
- 15. Nicht unterstützte TIFF Kompression
- 16. Schlüsselwort nicht unterstützte Datenquelle
- 17. Von BitmapFactory.decodeByteArray unterstützte Formate (...)
- 18. Entity Framework unterstützte Datenbanken
- 19. Von UIWebView unterstützte Dateiformate
- 20. Android - Unterstützte Bildtypen
- 21. Nicht unterstützte URL iOS
- 22. WAPT-unterstützte Anfragen
- 23. Unterstützte Bildformate von BitmapImage
- 24. Sollten die Postfix-Operatoren nicht als binäre Operatoren betrachtet werden
- 25. Ternary Operatoren in C#
- 26. Thymeleaf - boolsche Operatoren
- 27. MATLAB-Operatoren als Funktionen
- 28. Identität Operatoren in Swift
- 29. Mehrere Operatoren zwischen Operanden
- 30. Rust benutzerdefinierte Operatoren
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
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
@ 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