2010-05-21 2 views
1

데이터베이스에 다른 종류의 데이터 유형을 저장하기 위해 문자열을 사용하는 실험을하고 있습니다. 쿼리를 수행 할 때 쿼리 자체에서 문자열을 올바른 형식으로 캐스팅해야합니다. NHibernate와 닷넷을 사용하고 있으며,이 기능이 있음을 알게 된 것을 기쁘게 생각합니다.Projections.Cast to DateTime을 사용하는 NHibernate 쿼리

public class Foo 
{ 
    public string Text { get; set; } 
} 

내가 성공적으로 숫자 값, 예를 들어,에 캐스팅 Projections.Cast를 사용 :이 간단한 클래스를 사용하고 있는데 예를 들어

다음 쿼리는 1-10 사이의 정수로 저장된 모든 Foos를 올바르게 반환합니다.

var result = Session.CreateCriteria<Foo>() 
    .Add(Restrictions.Between(Projections.Cast(NHibernateUtil.Int32, Projections.Property("Text")), 1, 10)) 
    .List<Foo>(); 

이제 DateTime으로 이것을 사용하려고하면 어떤 시도를하든 상관 없습니다. 왜?! Projections.Cast는 DB에서 실행하기 때문에

var date = new DateTime(2010, 5, 21, 11, 30, 00); 
AddFooToDb(new Foo { Text = date.ToString() }); // Will add it to the database... 

var result = Session 
    .CreateCriteria<Foo>() 
    .Add(Restrictions.Eq(Projections.Cast(NHibernateUtil.DateTime, Projections.Property("Text")), date)) 
    .List<Foo>(); 
+0

날짜 형식입니까? 날짜 형식을 지정해보십시오 .String()을 "dd MMMM yyyy"로 설정하고보십시오. 확실하지 않다. 나는 생각하지 않았다. 그냥 생각해 보자. –

+0

쿼리하기 전에 캐스팅해야한다면 엉덩이에 큰 고통이 될 것이다. 정말 필요한 경우 실제 유형을 저장하는 열을 추가하는 것이 좋습니다. 그렇게하면 캐스트가 작동하는지 확인할 수 있습니다. – dotjoe

+0

타입을 알고있는 캐스트가 어떻게 작동하는지 어떻게 설명 할 수 있겠습니까? 그 타입을 알게 될테니까. – stiank81

답변

2

, 당신의 RDBMS 아마 date.ToString() 저장 형식을 좋아하지 않는다. 또한 DB에 쉬울 것이다

빠른 수정하는 대신 클라이언트에서 변환을하고있다 :

.Add(Restrictions.Eq("Text", date.ToString())) 

이제 순서대로 그 날짜가 식을 정렬 또는 범위에서 사용하는 경우에 필요 형식이 적절한 지 확인하십시오.

따라서 을 사용하는 대신 현재 문화권에 따라 변경되는 문제가 있으므로 .ToString("o") 또는 .ToString("s")을 사용하십시오.

+0

감사. 좋은 팁입니다. 그러나 예를 들어 확인하고 싶으면이 방법이 효과가 없을 것입니다. dateA와 dateB 사이의 날짜? 또는 - 날짜 문자열이 가장 중요한 것부터 가장 중요하지 않은 것으로 작성된 것이라면 아마도 그렇게 될 것이라고 생각합니다. – stiank81

+0

어쨌든 - 캐스트 작업을하려면 무엇이 필요한지 아십니까? 나는 현재 SQLite를 사용하고있다. 문자열의 형식은 내가 사용하고있는 데이터베이스 유형에 달려 있는가? 나는 NHibernate가 나를 위해이 간격을 처리하기 위해 여기에 있다고 생각 했는가? – stiank81

+0

NHibernate는 .NET 형식의 문자열을 마술처럼 SQLite가 사용하는 날짜 형식으로 변환 할 수 없습니다. '사이'문제에 대한 해결책을 찾았습니다. –