Я хочу включить преобразование значений свойств в свои запросы QueryOver.
Мне нравится писать запросы, следуя шаблону объекта запроса, напрямую создавая модели представления MVC. В моих моделях представлений я стараюсь использовать максимально простые типы свойств, не допуская сложности преобразования для представлений и контроллеров. Это означает, что иногда мне нужно преобразовывать один тип в другой, например даты в строки.
Можно было бы возразить, что такие преобразования должны выполняться в представлениях, но поскольку большинство моих моделей представлений напрямую транслируются в объекты JSON, это сделало бы преобразование более громоздким. Выполнение преобразования даты в строку в JavaScript в лучшем случае проблематично, а мой преобразователь JSON недостаточно гибок.
Вот пример того, что я делаю:
// Entity.
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public DateTimeOffset DateCreated { get; set; }
}
// View model.
public class CustomerViewModel
{
public string Name { get; set; }
public string DateCreated { get; set; } // Note the string type here.
}
// Query.
CustomerViewModel model = null;
List<CustomerViewModel> result = Session.QueryOver<Customer>()
.SelectList(list => list
.Select(n => n.Name).WithAlias(() => model.Name)
.Select(n => n.DateCreated).WithAlias(() => model.DateCreated))
.TransformUsing(Transformers.AliasToBean<CustomerViewModel>());
.Future<CustomerViewModel>()
.ToList();
При запуске кода запроса возникает следующее исключение:
Object of type 'System.DateTimeOffset' cannot be converted to type 'System.String'.
] Очевидно, это из-за следующей строки:
.Select(n => n.DateCreated).WithAlias(() => model.DateCreated))
Итак, вопрос: как включить преобразование даты в строку в запрос?
Я не хочу выполнять преобразование после того, как запрос выполняется, потому что мне понадобится дополнительный промежуточный класс для хранения результатов перед их преобразованием.