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.