2013-01-12 1 views
2

마지막 줄의 아래 예에서 날짜 표현을 수행하는 방법을 잘 모르겠습니다. 유사한 쿼리가 실행되지 않습니다. 나는 어떤 종류의 Projections SqlFunction을 사용해야한다고 생각하니? 누구 한테 도움이 되니?날짜 값 표현식이있는 Fluent Nhibernate QueryOver

Session.QueryOver(() => myobj) 
.JoinAlias(() => myobj.Object,() => o1) 
.Where(() => myobj.SomeInt > o1.Date.Subtract(someTime).Minutes); 

답변

3

날짜 연산을 C# 메서드에서 DB 서버 함수로 변환해야합니다. 그래서 우리는 ICriterion 등이 SQL 문을 갖는이 ICriterion

DateTime someTime = ...; 
var sqlString = " DATEDIFF(mi, ?, [Date]) < {alias}.SomeInt "; 
var sql = NHibernate.Criterion.Expression.Sql(sqlString 
       , someTime 
       , NHibernate.NHibernateUtil.DateTime); 

만들 수 있습니다 개체를 열 Date을 가지고 기대

DATEDIFF(datepart, startdate, endate)

: MS SQL 서버의 경우, 우리는 DATEDIFF 기능을 사용할 수 있습니다 스 니펫을 조정할 수 있습니다 :

Session 
    .QueryOver(() => myobj) 
    .JoinAlias(() => myobj.Object,() => o1) 
    .Where(sql); // sql = our ICriterion above 

빠른 예제 ... 출발점 NHibernate API를 사용하는 방법 ... 명시 적

+0

명시 적으로 사용하지 않으려면 일부 하위 쿼리가 더 적합해야합니다. SQL에 대한 조정을 통해 예제를 작성했습니다 문자열은 "DATEDIFF (mi,?, {alias} .SomeDate)"와 같이 작동합니다. {alias} .SomeInt와 {alias} .AnotherInt 사이에 있습니다. 제 질문은 제 실제 코드에 여러 별칭이 있고 .SomeDate와 .SomeInt는 다른 유형의 별칭입니다. 올바른 별칭을 지정하려면 어떻게해야합니까? 도와 주셔서 감사합니다. – Suedeuno

+0

내 대답은 일반적인 질문에 대한 힌트 일뿐입니다. SqlExpression의 방법과 성능을 보여주는 출발점을 알기 만하면됩니다. 음, * DATEDIFF * 결과를 반환하는'o1'의 detached'subquery'를 생성하십시오. 이 경우'{alias}'는'o1' 별명으로 대체 될 것입니다. 다음 단계는'.Where (Subqueries.PropertyGt ("SomeInt", subQuery.DetachedCriteria))'를 추가합니다. * '하위 쿼리'찾기 * 작동 예제는 여기 http://stackoverflow.com/a/14080092/1679310 –