代码之家  ›  专栏  ›  技术社区  ›  stiank81

带投影的nhibernate查询。强制转换为日期时间

  •  1
  • stiank81  · 技术社区  · 15 年前

    我正在尝试使用字符串在数据库中存储不同类型的数据。当我进行查询时,我需要在查询本身中将字符串强制转换为正确的类型。我正在将.NET与nhibernate结合使用,并且很高兴地了解到它有一些功能。

    例如,我使用这个简单的类:

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

    我成功地使用了projects.cast转换为数值,例如下面的查询正确地返回了所有foo,其中一个整数存储为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>();
    
    1 回复  |  直到 10 年前
        1
  •  2
  •   Diego Mijelshon    15 年前

    自从 Projections.Cast 在数据库中执行,您的RDBMS可能不喜欢 date.ToString() .

    在数据库中也更容易的快速修复方法是在客户机中进行转换:

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

    现在,为了在排序或范围表达式中使用这些日期,您需要确保格式是适当的。

    所以,不要使用 .ToString() 也有根据当前文化变化的问题,使用 .ToString("o") .ToString("s") .