类似于NHibernate中的DateTime查询

类似于NHibernate中的DateTime查询,nhibernate,orm,criteria,sql-like,Nhibernate,Orm,Criteria,Sql Like,对于varchar类型的列,我可以编写这样的搜索查询: public IList<Order> GetByName(string orderName) { using (ISession session = NHibernateHelper.OpenSession()) { return session.CreateCriteria<Order>(). Add(Restrictions.Like("Name", string.Format("%{0}%",

对于varchar类型的列,我可以编写这样的搜索查询:

public IList<Order> GetByName(string orderName)
{
 using (ISession session = NHibernateHelper.OpenSession())
 {
  return session.CreateCriteria<Order>().
   Add(Restrictions.Like("Name", string.Format("%{0}%", orderName))).
   List<Order>();
 }
}
public IList GetByName(字符串orderName)
{
使用(ISession session=NHibernateHelper.OpenSession())
{
返回会话。CreateCriteria()。
添加(限制,如(“Name”,string.Format(“%{0}%”,orderName)))。
List();
}
}
如何为具有DateTime类型的列实现类似的搜索查询

public IList<Order> GetByDateTime(string str)
{
    using (ISession session = NHibernateHelper.OpenSession())
    {
        return session.CreateCriteria<Order>()
            .Add(Restrictions.Like(Projections.Cast(NHibernateUtil.String, Projections.Property("Created")),
                                    '%' + str + '%'))
            .List<Order>();
    }
}
public IList GetByDateTime(字符串str)
{
使用(ISession session=NHibernateHelper.OpenSession())
{
返回会话。CreateCriteria()
.Add(Restrictions.Like(Projections.Cast(NHibernateUtil.String,Projections.Property)(“Created”),
“%”+str+“%”)
.List();
}
}
也就是说,如果向该方法传递了日期和部分时间(例如“25.03.2010 19”),则显示在此期间执行的所有订单:
25.03.2010 19:22:00
25.03.2010 19:44:00

2010年3月25日19:59:00

只需检查日期是否在您想要的范围内:

DateTime beginDate = new DateTime(2010, 3, 25, 19, 0, 0);
DateTime endDate = new DateTime(2010, 3, 25, 20, 0, 0);
return session.CreateCriteria<Order>()
   .Add(Expression.Between("OrderDate", beginDate, endDate))
   .List<Order>();
DateTime beginDate=newdatetime(2010,3,25,19,0,0);
DateTime endDate=新的日期时间(2010,3,25,20,0,0);
返回会话。CreateCriteria()
.Add(表达式.Between(“OrderDate”,beginDate,endDate))
.List();

我在使用LINQ时遇到了类似的问题,并通过vikram nayak发布的关于此处所问问题的答案进行了修复:

我就是这样做的:
我在vikram的示例中替换了以下类:

public class ExtendedLinqtoHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
{
    public ExtendedLinqtoHqlGeneratorsRegistry()
    {
        this.Merge(new DateTimeToShortDateStringGenerator());
        //I had to use the lines below instead.
        //MethodInfo method = ReflectionHelper.GetMethodDefinition<DateTime>(x => x.ToShortDateString());
        //RegisterGenerator(method, new DateTimeToShortDateStringGenerator());
    }
}

public class DateTimeToShortDateStringGenerator : BaseHqlGeneratorForMethod
{
    public DateTimeToShortDateStringGenerator()
    {
        SupportedMethods = new[]
        {
            ReflectionHelper.GetMethodDefinition<DateTime>(x => x.ToShortDateString())
        };
    }

    public override HqlTreeNode BuildHql(MethodInfo method, System.Linq.Expressions.Expression targetObject, ReadOnlyCollection<System.Linq.Expressions.Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
    {
        return treeBuilder.MethodCall("DateTimeToShortDateString", visitor.Visit(targetObject).AsExpression());
    }
}

public class CustomDialect : MsSql2008Dialect
{
    public CustomDialect()
    {
        RegisterFunction(
            "DateTimeToShortDateString",
            new SQLFunctionTemplate(
            NHibernateUtil.DateTime,
            "CONVERT(NVARCHAR(10), ?1, 105)"
            )
        );
    }
}

你的回答是可以理解和合乎逻辑的。但是…用户仅指定日期字符串,如“14.04.2010”、“2010”、“14.04”、“04.2010 22:06”等@Anry:如果
2010
14.04
都是有效输入,如何消除歧义<代码>14.04可能表示4月14日,也可能表示2014年4月。或者可能是下午2点04分。如果输入仅为
10
,应解释为2010年还是10月?最简单的解决方案是要求用户输入日期范围,而不是任意文本输入。更为用户友好、但指数级难度更大的解决方案是使用日期算法和一些正则表达式将模糊日期解析为可用范围。NHibernate无法完成sql中无法完成的任何操作,因此您需要像Aaronaught建议的那样,在C#中创建自己的日期解析函数
using (session.BeginTransaction())
{
    var patients = session.Query().Where(p => p.BirthDate.ToShortDateString().Contains("1975"));
}