Die Leistungsmerkmale zwischen ICriteria und HQL variieren nach und nach (ich weiß nicht, über QueryOver) aus einem einfachen Grund.
ICriteria-Abfragen werden standardmäßig versuchen, Ihre Abrufstrategien wie in Ihrem Mapping definiert zu implementieren, während HQL standardmäßig alles Lazy berücksichtigt und abhängig von Ihren Join-Deklarationen innerhalb Ihrer Abfrage definiert, was eifrig abgerufen wird.
Zusätzlich hängt ICriteria von der Abbildung für die Parameterübergabe ab, wohingegen HQL explizite Parametertypen, z. IQuery.SetInt32 ("fooParam", 5);
Was wirklich wichtig ist, ist die Pluggability von ICriteria-Abfragen (siehe ICriteria.CreateCriteria(). CreateCriteria() etc.), wo die NH-Engine die ICriteria auflösen und versuchen muss, das valideste SQL zu generieren.
Auf der gegenüberliegenden Seite ist es wahrscheinlich einfacher vorherzusagen, ob eine HQL-Abfrage konsistente Ergebnisse liefert und somit die Verwendung von QueryCache erleichtert.
In beiden Fällen wird die Konfiguration einmal mit den ISessionFactory-Erstellungs- und Mapping-Definitionen generiert, und what-not sind im Arbeitsspeicher, daher ist die Leistung gut.
Die eigentliche SQL-Generierung ist unterschiedlich zwischen den beiden gemacht und das ist der Grund, dass ein Dienstprogramm für ICriteria -> HQL nicht existiert.
Am Ende hat meine Erfahrung gezeigt, dass die Leistung zwischen den 2 ist wahrscheinlich die gleichen geben oder einige Millisekunden.
Als Randbemerkung, sowie NHibernate Betrieb, zum Beispiel in prägnanter SQL-Generierung für die Length
in der .hbm.xml Mapping-String-Eigenschaften führen so weit wie möglich in der Abbildung erklärt in NHibernate Überprüfung Zeichenfolge führen Längen, bevor Sie in die Datenbank gehen.
Sehr schön. Lassen Sie uns sehen, was die anderen über QueryOver sagen. – mynkow