2013-04-07 2 views
0

성능상의 이유로 인해 실제 ADO.NET (테이블 반환 매개 변수 포함)을 사용하여 실제 명령을 작성해야한다는 쿼리가 있습니다. LINQ to SQL 또는 EF를 사용하면 DbCommand.ExecuteReader()에 의해 반환 된 DbDataReaderDataContext.Translate<T>(DbDataReader) 또는 ObjectContext.Translate<T>(DbDataReader) 메서드에 전달할 수 있으며 결과 집합을 개체로 변환하여 IEnumerable<T>을 반환합니다.NHibernate의 LINQ to SQL과 EF의 번역본 <T>()

나는 통과 할 수 있습니다 NHibernate에의 동등한 API가있는 DbDataReader/IDataReader 또는 심지어 DbCommand/IDbCommand 및 NHibernate에 개체를 다시 얻을?

ISession.CreateQuery(string)으로 생성 된 명령의 구성을 가로채는 방법이 있습니다. 따라서 기본 방식 인 DbCommand을 내가 원하는대로 작동하도록 수정할 수 있습니까?

+0

'CreateSQLQuery'를 사용할 수없는 이유가 있습니까? – mickfold

+0

@penfold : 예, 앞서 언급했듯이 테이블 반환 매개 변수를 사용해야하기 때문입니다. –

답변

1

사용자 정의 UserType을 작성하여 테이블 반환 매개 변수를 처리 할 수 ​​있습니다.

NHibernate는 공개 메소드에서 DataReader -> entities 변환을 노출하지 않습니다.

+0

이것은 시작하기에 좋은 장소 인 것 같습니다. 'IUserType.NullSafeSet()'에는 table-value 매개 변수를 추가해야하는'IDbCommand' 유형의 매개 변수가 있습니다. –

+0

정말 그 일을하는 가장 쉬운 방법입니다, 감사합니다! 나는 session.CreateSQLQuery ("SELECT * FROM Customers WHERE Id IN (SELECT Value FROM : tableType)")'을 수행 할 수있는 지점에 도달했다. 그러나 그것은'IQuery.AddEntity()'등을 호출 할 것을 요구합니다. 나는 다음과 같이 HQL을 사용하여 하나의 추상화 수준을 높이려고했다.'session.CreateQuery ("FROM Customers WHERE Id IN (SELECT Value FROM : tableType)")')하지만,'Antlr.Runtime.NoViableAltException'을 던집니다. 나는 LINQ에서 이것을 사용할 수 있지만 HQL의 논리적 인 단계가 아님을 알기를 원한다. 어쩌면 HQL을 건너 뛸 필요가 있을까요? –

+0

해킹이 심하지 않으면 SQL보다 더 높은 수준으로 이동할 수 있다고 생각하지 않습니다. 그냥 SQL을 유지. –