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.
Also ich nehme es, ich habe keinen offensichtlichen Fehler gemacht. –