2011-03-21 4 views
2

나는 NHibernate 구동 저장소, Fluent 매핑을 사용하고 Linq to NHibernate을 사용하려고합니다. C# NHibernate 간단한 질문

그러나

Retrieve<XValue>(x => (x.Timestamp.CompareTo(start) >= 0 && 
         x.Timestamp.CompareTo(end) <= 0)); 

// 'Retrieve' here acts simply as 'session.Query<T>().Where(expression);' 

나는 다음과 같은 결과를 얻을 같은 몇 가지 간단한 쿼리 :

System.NotSupportedException: Int32 CompareTo(System.DateTime) 

나는 이유는 모르겠지만, CompareTo 작업에 투영되지 않습니다 데이터베이스와 출력도 이상하게 보입니다.

create table "QuotUnitDescriptor" (
    Id integer, 
    PaperId INTEGER, 
    Timestamp DATETIME, 
    InPaperIdx INTEGER, 
    primary key (Id) 
) 

NHibernate: INSERT INTO "QuotUnitDescriptor" ...................... 

// Many INSERT's 

NHibernate: select cast(count(*) as INTEGER) as col_0_0_ 
    from "QuotUnitDescriptor" binaryunit0_ 

이 작업이 select -> integer 작업을 호출하는 이유를 이해할 수 없습니다.

다음 날짜 별 쿼리를 어떻게 구현해야합니까?(Linq을 사용하는 것이 더 좋지만 criterias도 좋습니다.)

+0

타임 스탬프를 0으로 비교하고 있습니다. 이유가 무엇일까요? – Vadim

+0

@ Yads 코드에서 'start' 및'end' 타임 스탬프와 비교할 것입니다. –

답변

5

NHibernate.Linq 공급자가 CompareTo 호출을 sql로 변환 할 수 없습니다. 같은

사용 무언가 :

Retrieve<XValue>(x => x.Timestamp>start && x.Timestamp<end); 

추신 리포지토리를 피하십시오. 그것은 순진한 추상화입니다.

+0

감사합니다. 리포지토리에 대한 귀하의 성명을 진술 해주십시오. 대신에 어떤 종류의 추상화를 사용해야합니까? 더 많은 도메인 특정 도메인이 있습니까? –

+1

@ Yippie-Kai-Yay NHibernate를 사용하는 경우 추상화하지 마십시오. 당신이 그걸로 자신을 묶고 싶으면 한 번 그렇게해라. 더 깊은 개체 그래프 및 성능 문제에 직면하기 전까지는 괜찮습니다 (리포지토리 사용). 지루한'read '부분을 추상화하는 것보다 상태 변경을 적절히 검증하는 풍부한 도메인 모델을 확보하는 것이 더 유리합니다. http://ayende.com/Blog/archive/2011/03/16/architecting-in-the-pit-of-doom-the-evils-of-the.aspx –