2012-03-26 2 views
1

을 생산하지 건너 걸릴 :NHibernate에 다음 쿼리 Considoring 올바른 SQL

session.Query<Brand>() 
     .Where(x => x.Name == "Clause") 
     .Select(a => a.Name) 
     .Take(10) 
     .ToList(); 

NHibernate에 올바른 SQL 생성되지 않습니다 - 그것은 리미터를 추가 한 것으로 나타 코드에서 테이크를 생성하는 표시하지 않습니다 -하지 SQL에서.

어떤 아이디어?

생성 된 SQL :

select brand0_.br_name as col_0_0_ from Brands brand0_ 
where brand0_.br_name=?;p0 = 'Clause' 
+0

이러한 것들에 대해서는 잘 알고 있지 않습니다. 호출을 'Take'및 'Select'로 되돌릴 수 있습니까? –

+0

@Damien_The_Unbeliever 나는 레코드의 전부를 가져올 것이고 이름뿐 아니라 차이점이없는 더 나쁜 성능을 가져올 것이라고 확신한다. 스튜어트 당신이 쿼리를 실행하는 데 사용하는 EXACT 코드는 무엇입니까? 그리고 어떤 버전의 NHibernate? 위의 코드는 실제로 해결되지 않습니다 (ToList 또는 대안이 없음). 나는 비슷한 결과를 보았고 다음과 같은 결과를 보았습니다 : select TOP (@ p0) fundingpac0_.FinalPackage에서 col_0_0_EffectiveDate로 fundingpac0_ fundingpac0_.DeletedDate가 null이고 @ p0 = 10 [Type : Int32 (0)] – mattytommo

+0

세미 - SQL의 끝에있는 콜론 (끝 부분은 아님)은 문제가 있습니다. 유효하지 않은 Informix SQL로 세미 콜론 뒤에 머물러있게됩니다. 나는 'Take (10)'에 해당하는 것을 볼 수 없다. –

답변

1

나는 이러한 코드를 사용하고 있는데이 SQL에서 "TOP"을 가지고있다. (NHibernate에 버전 3.1)

@mattytommo이 옳다, 당신은 "() 목록"을 잊었다했습니다

session.Query<Brand>() 
     .Where(x => x.Name == "Clause") 
     .Select(a => a.Name) 
     .Take(10) 
     .List(); 

당신이 QueryOver을 사용 했습니까?

+0

오, 죄송합니다! ToList()를 사용했지만 일부는 내 예제에서 잊어 버렸습니다 ... (업데이트되었습니다!) 3.1.0.4000을 사용하고 있지만 Informix 데이터베이스를 사용하고 있습니다 .... –

+0

NHibernateLinq 공급자를 사용했지만 SqlServer에서 QueryOver를 사용합니다. 하지만 "session.Query "을 "session.QueryOver ()"으로 변경하여 사용해 볼 수 있습니다. – Anton

+0

특정 NH 유형을 반환하므로 QueryOver를 사용할 수 없습니다. IQueryable을 반환해야합니다. –