2009-08-25 4 views
1

LINQ 표현식을 HQL 문으로 변환하는 기존 솔루션을 아는 사람이 있습니까?누구나 LINQ 표현식을 NHibernate HQL 문으로 변환하는 방법을 알고 있습니까?

앞서 모든 좋은 samaritans에게 감사드립니다.

P.

우리는 이미 NHibernate에 Linq를 사용합니다. 그러나 select 문에서만 작동하며 HQL은 delete와 같은 다른 명령문 종류에 적합합니다. 그래서, Linq NHibernate 대답은 아니다.

+0

중복 : http://stackoverflow.com/questions/1192041/converting-hibernate-linq-query-to-hql – Paco

+1

아닙니다. 나는 또한 그 질문에 주목하고 심지어 대답했다. – mark

답변

2

Linq to nhibernate가 방금 released입니다. 그게 도움이 되니?

+0

이미 사용하고 있습니다. HQL은 delete와 같은 다른 연산에 사용될 수있는 반면 select 만 수행 할 수 있습니다. 그래서 아니오, 도움이되지 않습니다. – mark

+0

오케이. 질문을 적절하게 편집 할 것을 제안하십시오. –

0

쿼리에 LINQ를 사용하고 삭제 및 업데이트에 HQL을 사용합니다. LINQ 대신 짝수 기준이 여전히 유용 할 수 있습니다.

어느 하나/또는 상황이 아니므로 각 작업에 가장 적합한 도구를 선택할 수 있어야합니다.

+0

HQL은 NHibernate에 고유하며 서버 측 DAL 구현 세부 사항입니다. 나는 그것이 클라이언트 측에 "누설"되는 것을 원하지 않는다. 이것은 클라이언트 측에서 일부 엔티티를 삭제하도록 요청하는 것이다. 따라서 클라이언트는 linq 표현식을 지정합니다. linq to nhibernate가 있기 때문에 요청을 가져 오는 - 간단합니다, 어떤 기준으로 변환하고 다음에 의해 선택합니다. 그러나 기준에 의한 삭제 진술은 없으며 이는 문제입니다. – mark

+1

그건 또 다른 질문입니다. 그 문제를 해결하기 위해 또 다른 질문을 만드십시오. 여러 계층의 IMO를 사용하는 경우 클라이언트가 자체 linq 표현식을 보낼 수 없도록해야합니다. –

+0

http://stackoverflow.com/questions/1330432/in-a-multitier-application-should-a-client-be-allowed-to-send-its-own-linq-expres – mark

1

나는 똑같은 필요성이있다. 나는 LINQ 표현식을 사용하여 삭제할 필요가 있었지만, Hibernate는 HQL이나 SQL을 사용하는 삭제만을 지원한다. 코드의 나머지 부분은 LINQ 표현식을 사용하여 완전히 유형화되었으므로이 접근 방식이 마음에 들지 않아 테이블 및 속성 이름과 문자열을 조작해야했습니다.

나는 NHibernate 3.0과 함께 일하고 있는데, 나는 95 %의 길을 갔다.하지만 나는 리플렉션을 사용하여 개인/내부 메소드를 호출해야했다. 아래의 LINQ 표현을 위해 나에게 HqlQuery 객체를 제공합니다

NhQueryable<Product> queryable = (from p in session.Query<Product>() 
          where p.ProductId == 1 
          select p) as NhQueryable<Product>; 
      if (queryable != null) 
      { 
       Expression expression = queryable.Expression; 
       NhQueryProvider provider = queryable.Provider as NhQueryProvider; 
       MethodInfo prepareQueryMethod = typeof(NhQueryProvider).GetMethod("PrepareQuery", BindingFlags.Instance | BindingFlags.NonPublic); 
       object[] arguments = new object[] {expression, null, null}; 
       NhLinqExpression nhLinqExpression = prepareQueryMethod.Invoke(provider, arguments) as NhLinqExpression; 
       ExpressionToHqlTranslationResults translationResults = nhLinqExpression.ExpressionToHqlTranslationResults; 
       HqlQuery hql = translationResults.Statement as HqlQuery; 
      } 

I가 붙어 나는 HQL 문자열로 HqlQuery 개체를 변환 할 수 없습니다 오전. 누구나 이것에 대한 의견이 있으십니까? 아니면 다른 방식으로 문제를 해결 했습니까?

어쨌든 ISession.Delete가 오버로드되어 매개 변수로 IQueryable 또는 IQuery를 사용하면 큰 도움이 될 수 있다고 생각합니다. 나는 NHibernate에 초보자지만 NHibernate가 이미 기존의 메소드를 찾고 작업을 수행하기 위해 와이어 링하는 것을 아는 사람에게는 상당히 간단한 작업이어야한다.

+0

나는 재가입 한 자유를 헌신적 인 NH 메일 링리스트에서 결과. 이 게시물 주위에 약간의 트래픽이 있습니다 - 당신의 행동이 필요합니다. 게시물 URL은 http://groups.google.com/group/nhusers/browse_thread/thread/07cff495aa5f12e1입니다. – mark

관련 문제