2010-05-21 34 views
1

我正在嘗試使用字符串在數據庫中存儲不同類型的數據類型。當我做查詢時,我需要在查詢本身中將字符串轉換爲正確的類型。我在NHibernate中使用.Net,很高興知道存在這樣的功能。使用Projections.Cast進行NHibernate查詢DateTime

對於我使用這個簡單的類的實例:

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

我成功地使用Projections.Cast投爲數值,例如以下查詢正確返回所有Foos,並存儲爲int的整數 - 在1-10之間。

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

現在,如果我嘗試使用這個DateTime我無法讓它工作,無論我嘗試。爲什麼?!

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

這是日期的格式嗎?嘗試將date.ToString()格式化爲「dd MMMM yyyy」並查看。不知道,我沒有嘗試過,只是一個想法 – 2010-05-21 12:01:15

+0

如果你需要在查詢之前施放,這將成爲屁股的一大痛苦。如果你真的需要它,我會考慮添加一個列來存儲實際類型。這樣你就可以確保你的演員會工作。 – dotjoe 2010-05-21 15:37:19

+0

您是否介意解釋如何確定演員陣容的作品?因爲我會知道類型。 – stiank81 2010-05-21 18:43:30

回答

2

由於Projections.Cast執行數據庫,您可能RDBMS不喜歡被date.ToString()存儲格式。

速戰速決也將在DB更容易做轉換的客戶,而不是:現在

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

,爲了在排序或範圍表達式中使用的日期,你需要確保格式合適。

因此,使用.ToString("o").ToString("s"),而不是使用.ToString(),它也有根據當前的文化而改變的問題。

+0

謝謝。這是一個很好的提示。不過,如果我想檢查例如dateA和dateB之間的日期?或者 - 如果日期字符串是從最重要到最不重要的,我想它會..建立一些測試。 – stiank81 2010-05-21 18:46:37

+0

無論如何 - 你知道如何使演員工作?我目前正在使用SQLite - 字符串的格式取決於我使用的數據庫的類型嗎?我認爲NHibernate在這裏爲我處理這個差距? – stiank81 2010-05-21 18:52:16

+0

NHibernate不能神奇地將你的.NET格式的字符串轉換成SQLite使用的日期格式。查看我的新增內容以解決「間」問題。 – 2010-05-21 19:31:47