2011-01-20 2 views
3

문자열 변수에 저장된 열 이름을 기반으로 NHibernate 3.0 Linq 쿼리를 동적으로 정렬하려고합니다.제공된 속성 이름을 기반으로 NHibernate 3.0 Linq 쿼리를 주문하는 방법

// The value of this variable can be the name of any property of Document. 
string columnName = "column1"; 

var query = from n in Session.Query<Document>() 
      where n.DocumentNumber == documentNumber 
      // how to order by the value of columnName? 
      select n; 

orderby 키워드는 문자열을 받아 (또는 변수)하지만 난 실행할 때 다음을 수행합니다

가 실행할 수 없습니다 쿼리

:
var query = from n in Session.Query<Document>() 
      where n.DocumentNumber == documentNumber 
      orderby columnName 
      select n; 

나는이 예외가
select TOP (@p0) 
    accumulate0_.Id as Id9_, 
    accumulate0_.DocumentNumber as Documen10_9_ 
from dbo.Documents accumulate0_ 
where 
    [email protected] 
order by @p2 desc 

ORDER BY 1로 식별되는 SELECT 항목에는 열 위치를 식별하는 표현식의 부분 으로 변수가 포함됩니다. 변수는 이 열 이름을 참조하는 식으로 정렬 할 때만 허용됩니다.

나는 문자열 을 허용 .OrderBy 확장자 방법의 과부하를 제공하는 LINQ Dynamic Query Library이 알고 있지만, 분명히 전용 메모리 에서 작동합니다. 그러나 NHibernate 3.0을 사용할 때 예외를 throw합니다.

생성 된 SQL 쿼리에 ORDER BY 문에 적절한 열 이름이 지정되어 있으므로 NHibernate 영역에 있어야합니다.

NHibernate 기준을 사용하면 동적으로 정렬 할 수 있지만 NHibernate Linq를 사용하기 때문에 기준 기능에 액세스 할 수있는 것 같지 않습니다. 내가 NHibernate에 Linq를 사용하고 있기 때문에

답변

4

동적 LINQ는 메모리뿐만 아니라 모든 소스에서 작동합니다.

그게 지금 사용하고 있습니다.

+0

그럼 내가 잘못 생각한 것 같아.하지만 슬픈 듯이 Dynamic LINQ OrderBy는 NHibernate 3.0을 사용할 때 예외를 던진다. (예전에는 기억이 안 난다. 버전. –

+0

예외를 붙여 넣으면 도움을 줄 수 있습니다. –

+0

그 동안 무슨 일이 일어 났는지는 모르겠지만 동적 인 Linq OrderBy 메서드를 시도해 보았습니다. 열 이름을 문자열로 제공하면 작동합니다! 감사! –

1

하지만, 나는 기준 기능에 액세스하지 않는 것 .

분명히 세션. CreateCriteria를 가져와야합니까? NHibernate Linq와 CreateCriteria는 함께 더 행복하게 살아야한다.

linq 만 사용하는 것이 가능한지 확실하지 않으며 QueryOver를 사용하는 것이 가능하지 않다고 생각하지만 한 가지 방법은 지적한대로 CreateCriteria를 사용하는 것일 수 있습니다.

var query = Session 
    .CreateCriteria<Document>() 
    .Add(Restrictions.Eq("DocumentNumber", documentNumber)) 
    .AddOrder(Order.Asc("column1")) 
    .List<Document>(); 

또 다른 방법은 HQL을 사용하는 것입니다.

관련 문제