Я использую Linq для NHibernate по умолчанию. Когда я сталкиваюсь с ошибками или ограничениями, я переключаюсь на HQL.
Это чистый подход, если вы храните все свои запросы вместе в классе доступа к данным, таком как Repository.
public class CustomerRepostitory()
{
//LINQ for NHibernate
public Customer[] FindCustomerByEmail(string email)
{
return (from c in _session.Linq<Customer>() where c.Email == email).FirstOrDefault();
}
//HQL
public Customer[] FindBestBuyers()
{
var q = _session.CreateQuery("...insert complex HQL here...");
return q.List<Customer>();
}
}
Вы спрашивали о рефакторинге. Очевидно, что над LINQ позаботится IDE, поэтому для любого оставшегося HQL довольно легко отсканировать эти классы репозитория и вручную изменить HQL.
Хорошей практикой является использование HQL в XML-файлах. Может быть, посмотрите, сможет ли плагин ReSharper NHIbernate *1009* обрабатывать рефакторинг запросов к настоящему моменту?
A большой улучшение при написании или рефакторинге запросов (HQL или LINQ) состоит в том, чтобы поместить методы поиска в модульный тест . Таким образом, вы можете быстро настроить HQL / LINQ, пока не получите зеленую полосу. Цикл компиляции / тестирования / обратной связи очень быстрый, особенно если вы используете базу данных в памяти для тестирования.
Кроме того, если вы забудете отредактировать HQL после рефакторинга, модульные тесты должны очень быстро сообщить вам о сломанном HQL.