2009-07-31 10 views
5

Ich benutze LINQ im Allgemeinen, besonders LINQ-zu-Objekte, daher bin ich ziemlich fließend in LINQ.Linq zu NHibernate vs. ICriteria

Ich erwog, LINQ-zu-NHibernate als Abfragesprache für mein NHibernate-Projekt zu verwenden. Als ich einige Tests schrieb, bemerkte ich, dass LINQ-zu-NHibernate nicht die gleiche Abfrage wie ICriteria macht. Da ich LINQ lieber verwenden würde, würde ich gerne fragen, ob jemand ähnliche Unterschiede kennt oder ob ich mich überhaupt nicht um die Leistung kümmern sollte (Die Hochleistungsoperationen müssten sowieso mit NHibernate optimiert werden, so weit ich komme es). Siehe das folgende Beispiel:

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

gibt mir die folgende 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(); 

gibt

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 

Offensichtlich JOIN die LINKE wäre nicht notwendig.

Ist etwas falsch mit meiner LINQ-Abfrage oder ist es nur eine Einschränkung? Und sollte ich mir darüber Sorgen machen?

Icey

EDIT: Ich versuchte, die LINQ-Anweisung an die folgende Veränderung:

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

die generierten SQL ist die gleiche, aber.

Antwort

1

Es sieht für mich so aus, als ob NHibernate.Linq diese Optimierung jetzt 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 (für NHib v3 gedacht, denke ich).

Cheers, John

+0

Also ich nehme es, ich habe keinen offensichtlichen Fehler gemacht. –

0

Verwenden Sie die latest release?

Ich bin es noch selbst zu versuchen. Aber ich muss sagen, ich stoße immer auf Probleme beim Versuch, Linq-zu-NHibernate zu verwenden. Nun, vielleicht bin ich zu viel Neuling für beide ... aber Linq soll intuitiv sein, und es gibt nichts intuitives, Nullbezug von einer verdammten einfachen Frage zu bekommen (wie deine), die tadellos in HQL funktioniert.

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

+1

Ja, ich benutze die Version 1.0 von Linq to NHibernate. Übrigens, ich bekomme keine Null-Referenzen. Der einzige Ort, an dem Sie eine Null-Referenz-Ausnahme erhalten könnten, wäre am Ende First(). Versuchen Sie es mit FirstOrDefault(). Und ich würde gerne HQL überspringen, da ich Magie-Strings wirklich hasse, wo immer sie vermeidbar sind. –

Verwandte Themen