НРАВИТСЯ запрос для DateTime в NHibernate - PullRequest
2 голосов
/ 14 апреля 2010

Для столбца типа 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>();
 }
}

Как реализовать аналогичный поисковый запрос для столбца с типом 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>();
    }
}

То есть, если в методе переданы дата и неполный рабочий день (например, «25.03.2010 19»), то отображаются все заказы, выполненные за этот период времени:
25.03.2010 19:22:00
25.03.2010 19:44:00
25.03.2010 19: 59: 00

Ответы [ 2 ]

3 голосов
/ 14 апреля 2010

Просто проверьте, находится ли дата в пределах желаемого диапазона:

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>();
0 голосов
/ 24 апреля 2012

У меня была похожая проблема с использованием LINQ, и я исправил ее с помощью ответа, опубликованного Викрамом Найяком на заданный здесь вопрос: Nhibernate LINQ DateTime.AddDay не работает .

Вот как я это сделал:
В примере Викрама я заменил следующие классы:

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)"
            )
        );
    }
}

Затем вы можете использовать следующий синтаксис:

using (session.BeginTransaction())
{
    var patients = session.Query().Where(p => p.BirthDate.ToShortDateString().Contains("1975"));
}
...