使用Nhibernate比较两个日期“Strings”Sqlite

时间:2016-11-03 22:24:54

标签: sqlite nhibernate

我正在使用SQLite和NHibernate,我将我的日期作为字符串存储在SQLite上,因为我无法存储为Date。 一切都很好,直到需要比较日期..我尝试了以下代码:

            var initialDate = DateTime.Parse(_InitialDate);
            var finalDate = DateTime.Parse(_FinalDate);
            return session.QueryOver<Locacoes>()
                .Where(c => DateTime.Parse(c.InitialDate) >= initialDate )
                .Where(c => DateTime.Parse(c.FinalDate) <= finalDate).List();

但我在第一个“Where”上得到了一个例外:“'Locacoes'类型的变量'c'在范围''上被引用,但它没有被定义”。
如何使用NHibernate比较SQLite上的日期? 我用上面的代码尝试了很多东西,但没有用。

编辑:它不重复,错误可以相同,但结果不同

1 个答案:

答案 0 :(得分:0)

首先,虽然Sqlite喜欢假装一切都是字符串,但应该将其视为存储格式,并且没有理由为什么对象模型应该使用字符串来保存日期值。您的对象模型当然应该将属性键入DateTime或DateTimeOffset。然后正确配置你的NHibernate映射以将值映射到SQLite可以处理的内容(实际上我认为如果你只是告诉它使用SQLiteDialect,NHibernate会自动处理它。)

其次,我不认为QueryOver()可以处理像DateTime.Parse()这样的事情。不要将QueryOver()与Linq2NHibernate(Query()方法)混淆,后者具有更高级的表达式解释能力。另一方面,当您开始在对象模型中使用正确的类型时,不再需要使用Parse()。

至少如果你使用LINQ,它应该能够为SQLite处理DateTime.Date,如果你需要它:

session.Query<Locacoes>()
       .Where(l => c.InitialDate.Date >= initialDate)

当然,如果您需要忽略非零时间组件,则只需要将Date放在那里。