2010-05-21 81 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