2009-07-31 4 views
5

나는 LINQ를 많이 사용하는데 특히 LINQ-to-Objects를 사용하기 때문에 LINQ에 능숙하다.Linq to NHiternate 대 ICriteria

NHibernate 프로젝트의 쿼리 언어로 LINQ-NHibernate를 사용하려고 생각했습니다. 몇 가지 테스트를 작성했을 때, LINQ-to-NHibernate가 ICriteria와 동일한 쿼리를 작성하지 않는다는 것을 알았습니다. LINQ를 사용하기를 원하기 때문에 누구나 유사한 차이점을 알고 있는지 물어보고 싶습니다. 또는 일반적으로 성능에 대해 신경 쓰지 않아도됩니다. (고성능 작업에서는 NHibernate를 조정해야합니다. 그것).

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

나에게 다음과 같은 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 

반면

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

은 분명히

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 

를 제공을, 왼쪽은되지 않을 것 가입 필요한.

내 LINQ 쿼리에 문제가 있습니까? 아니면 그냥 제한 사항입니까? 그리고 내가 처음에 그것에 대해 걱정해야합니까?

Icey

편집 : 나는 다음에 LINQ 문을 변경하려고 :

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

생성 된 SQL하지만, 동일합니다.

답변

1

NHibernate.Linq가 지금이 최적화를 지원하지 않는 것처럼 보입니다. 기준 쿼리 나 HQL을 사용해야하거나, 완전히 통합 된 LINQ 공급자가 출시 될 때까지 기다려야한다고 생각합니다. (생각했던 NHib v3에서 예정된).

건배, 요한은

+0

나는 그것을 가지고, 나는 명백한 실수를하지 않았다. –

0

latest release을 사용합니까?

아직 직접 사용해 보지 않았습니다. 하지만 나는 Linq-to-Hibernate를 사용하려고 할 때 항상 문제에 부딪친다고 말해야한다. 글쎄, 아마도 둘다 너무 초보자인데 ... Linq는 직관적이라고 가정하고, HQL에서 완벽하게 작동하는 단순한 쿼리 (당신처럼)에서 null 참조를 얻는 데 직관적 인 방법은 없습니다.

하지만 개발 단계부터 이해할 수 있습니다. 그리고 여전히 그렇습니다 ;-)

+1

예, 나는 Linq에 투 자 NHibernate의 버전 1.0을 사용합니다. Btw, null 참조를 가져 오지 않습니다. 여기서 null 참조 예외를 얻을 수있는 유일한 장소는 끝에있는 First()입니다. FirstOrDefault()를 사용해보십시오. 그리고 나는 마술 끈이 어떻게 든 피할 수있는 곳이라면 진심으로 싫어하므로 HQL을 건너 뛰고 싶습니다. –