2014-10-15 2 views
1

이 SQL을 QueryOver 표기법으로 변환하는 데 문제가 있습니다. 나 좀 도와 줄 수있어?NHibernate QueryOver 내부 선택이있는 곳

SELECT * FROM Alerts a 
WHERE a.CreatedOn = (
    SELECT MAX(b.CreatedOn) FROM Alerts b WHERE b.UserFk=a.UserFk); 

모든 사용자에 대해 마지막 경고를 선택하려고합니다. CreatedOn을 사용하며 Id를 사용할 수 없습니다.

지금까지 가지고

session.QueryOver(() => alertAlias) 
     .SelectList(list => list 
      .Select(() => alertAlias.User.Id) 
      .SelectSubQuery(
       QueryOver.Of<Alerts>() 
        .Where(x => x.User.Id == alertAlias.User.Id) 
        .OrderBy(x => x.CreatedOn).Desc 
        .Select(x => x.CreatedOn) 
        .Take(1))); 

나는 모든 사용자의 경고 행에 사용자의 마지막 경고 날짜를 추가 알고있다. 하지만 마지막 경고 만 보내고 싶습니다.

+0

은 우리에게 코드를 보여주세요 ... 또 다른 이야기입니다. 그러면 도움이 될 것입니다. 한편보십시오 [여기] (http://stackoverflow.com/a/20537260/1679310) 또는 [there] (http://stackoverflow.com/a/22838831/1679310) 또는 ... –

+0

감사합니다. 내 질문. – Kamil

답변

0

SELECT 문 내부에 하위 쿼리를 사용하려고했습니다. 그러나 이것을 WHERE으로 옮겨야합니다. 이 방법이어야한다 :

// this is a subquery (SELECT .... 
var subquery = QueryOver.Of<Alerts>() 
     .Where(x => x.User.Id == alertAlias.User.Id) 
     .OrderBy(x => x.CreatedOn).Desc 
     .Select(x => x.CreatedOn) 
     .Take(1))); 

// main Query could now have or do not have that subquery selected 
var query = session.QueryOver(() => alertAlias) 
    .SelectList(list => list 
     .Select(() => alertAlias.User.Id) 
     // could be there 
     .SelectSubQuery(subquery) 
    ) 
    // but mostly here we do use WHERE clause 
    .WithSubquery 
     .WhereProperty(() => alertAlias.CreatedOn) 
     .Eq(subquery) 
     ; 

// such a query could be returned as a list of arrays 
var results = query.List<object[]>(); 

우리는 또한 몇 가지 결과 변압기를 사용할 수 있습니다, 그러나 이것은 당신은 문제가 있다면 어디

+0

감사! 나는 잘 몰랐다. 서브 퀘리와 함께. 재산. 첫 번째 의견의 링크도 도움이되었지만이 방법은 더 간단합니다. – Kamil

+0

위대한 그 선생님을 참조하십시오;) NHibernate 놀라운 도구입니다 ...하지만 조금 배우고 도전 ...하지만 나중에) 행운을 빕니다 –