Запрос NHibernate с Projection.Cast to DateTime - PullRequest
1 голос
/ 21 мая 2010

Я экспериментирую с использованием строки для хранения различных типов данных в базе данных. Когда я делаю запросы, мне нужно привести строки к нужному типу в самом запросе. Я использую .Net с NHibernate, и был рад узнать, что существует функциональность для этого.

Для примера я использую этот простой класс:

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

Я успешно использую Projection.Cast для приведения к числовым значениям, например, следующий запрос корректно возвращает все Foos с целым числом, хранящимся как 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 Ответ

2 голосов
/ 21 мая 2010

Поскольку Projections.Cast выполняется в БД, вашей СУБД, вероятно, не нравится формат, сохраненный date.ToString().

Быстрое исправление, которое также будет проще в БД, - это преобразование в клиенте:

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

Теперь, чтобы эти даты использовались в выражениях сортировки или диапазона, необходимо убедиться, что формат соответствует.

Таким образом, вместо использования .ToString(), который также имеет проблему изменения в соответствии с текущей культурой, используйте .ToString("o") или .ToString("s").

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