Поиск критериев NHibernate по времени суток - PullRequest
2 голосов
/ 30 июня 2011

Я пытаюсь создать критерий NHibernate, который получит все сообщения, созданные в определенное время суток. Например, я хочу, чтобы все сообщения были созданы между 12:15:00 и 02:20: 00.

Пост будет выглядеть так

public class Post
{
   public virtual DateTime CreatedOn { get; set;}
}

И отображение:

<class name="Post" table="Posts">
   <property name="CreatedOn" not-null="true"/>
</class>

И я хотел бы использовать DetachedCriteria (это будет частью более крупного поиска) что-то похожее на:

var criteria = DetachedCriteria.For<Post>
               .Add(Restriction.Ge("CreatedOn", Time(12, 15, 00))
               .Add(Restriction.Le("CreatedOn", Time(2, 20, 00));

Я знаю, что это не совсем правильно, но показывает, чего я пытаюсь достичь. Использование SQL Server в качестве базы данных.

Ответы [ 2 ]

3 голосов
/ 01 июля 2011

Если бы вы создали запрос непосредственно в SQL, вы бы использовали функцию datepart. Этот вопрос касается вызова функции datepart из NHibernate. В основном вы используете проекцию NHibernate: Projection.SqlFunction.

Что немного усложняет, так это то, что вам нужно иметь несколько проекций, по одной на час, минуту и ​​секунду (в зависимости от необходимой детализации). Кроме того, я не нашел способа вызвать datepart напрямую, так как не смог найти способ передать параметр datepart (это строковая константа без кавычек). Вместо этого вы можете расширить диалект так:

  public class MsSql2008ExtendedDialect : MsSql2008Dialect
    {
        public MsSql2008ExtendedDialect()
        {
            RegisterFunction("DATEPART_HOUR", new SQLFunctionTemplate(NHibernateUtil.DateTime, "datepart(hh, ?1)"));
        }
    } 

EDIT: Однако я хотел бы предостеречь, чтобы принять к сведению производительность запросов. Поскольку по времени дня нет индекса, даже если в столбце даты есть индекс, производительность запросов может снизиться, если имеется много записей, и это единственный столбец, на который накладываются ограничения. В этом случае может быть лучше добавить явные столбцы для часа / минуты.

1 голос
/ 01 июля 2011

Я предполагаю, что вам нужны все результаты с 12:15:00 до 2:20:00 в любой день?

Не думаю, что это идеальный ответ, но моя первая мысль - создать еще один столбец (возможно, рассчитанный) с указанием времени дня (например, часов / минут / секунд с полуночи в зависимости от вашего зернистость).

Вы можете отобразить это как временной интервал в Посте и отфильтровать по нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...