5 Stimmen

Linq zu NHibernate vs. ICriteria

Ich verwende LINQ im Allgemeinen viel, insbesondere LINQ-to-Objects, daher bin ich ziemlich fließend in LINQ.

Ich habe überlegt, LINQ-to-NHibernate als Abfragesprache für mein NHibernate-Projekt zu verwenden. Als ich einige Tests schrieb, stellte ich fest, dass LINQ-to-NHibernate nicht die gleiche Abfrage wie ICriteria macht. Da ich lieber LINQ verwenden möchte, möchte ich fragen, ob jemand ähnliche Unterschiede kennt, oder ob ich mich einfach nicht um die Leistung im Allgemeinen kümmern sollte (die Hochleistungsoperationen müssten mit NHibernate sowieso etwas angepasst werden, soweit ich das verstehe). Siehe das folgende Beispiel:

var query = (from inputItem in session.Linq<InputItem>()
             where inputItem.Project == project select inputItem).First();

erhalte ich folgendes SQL:

SELECT this_.ID as ID0_1_, this_.Name as Name0_1_, this_.Project_id as Project3_0_1_, project1_.ID as ID1_0_, project1_.Name as Name1_0_
    FROM "InputItem" this_ left outer join "Project" project1_ on this_.Project_id=project1_.ID
    WHERE this_.Project_id = @p0 limit 1;@p0 = 1, @p1 = 1

während

var criteria = session.CreateCriteria<InputItem>();
criteria.Add(Expression.Eq("Project", project));
criteria.SetMaxResults(1);
criteria.List();

donne

SELECT this_.ID as ID0_0_, this_.Name as Name0_0_, this_.Project_id as Project3_0_0_
    FROM "InputItem" this_
    WHERE this_.Project_id = @p0 limit 1;@p0 = 1, @p1 = 1

Der LEFT JOIN wäre natürlich nicht notwendig.

Stimmt etwas mit meiner LINQ-Abfrage nicht, oder ist es nur eine Einschränkung? Und sollte ich mir überhaupt Gedanken darüber machen?

Eisig

EDIT: Ich habe versucht, die LINQ-Anweisung in die folgende zu ändern:

var query = (from inputItem in session.Linq<InputItem>()
             where inputItem.Project.ID == project.ID
             select inputItem).First();

das generierte SQL ist jedoch dasselbe.

1voto

John Rayner Punkte 3485

Für mich sieht es so aus, als ob NHibernate.Linq diese Optimierung im Moment nicht unterstützt. Ich denke, Sie müssen eine Kriterienabfrage oder HQL verwenden oder warten, bis der vollständig integrierte LINQ-Anbieter veröffentlicht wird (geplant für NHib v3, glaube ich).

Zum Wohl, John

0voto

queen3 Punkte 15143

Verwenden Sie die neueste Version ?

Ich muss es selbst noch ausprobieren. Aber ich muss sagen, dass ich immer auf Probleme stoße, wenn ich versuche, Linq-to-NHibernate zu verwenden. Nun, vielleicht bin ich zu viel Neuling zu beiden... aber Linq soll intuitiv sein, und es gibt nichts intuitiv in immer Null-Referenz von einer verdammt einfachen Abfrage (wie Ihre), die perfekt in HQL funktioniert.

Aber das ist verständlich, denn das war in der Entwicklung. Und ist es immer noch, nehme ich an ;-)

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