我默认使用 Linq for NHibernate。当我遇到错误或限制时,我会切换到 HQL。
如果您将所有查询放在一个数据访问类(例如存储库)中,这是一种干净的方法。
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 插件现在是否可以处理查询重构?
编写或重构查询(HQL 或 LINQ)时的一大改进是将 finder 方法置于unit test之下。这样,您可以快速调整 HQL/LINQ,直到获得绿色条。编译/测试/反馈循环非常快,特别是如果您使用内存数据库进行测试。
此外,如果您在重构后忘记编辑 HQL,单元测试应该会很快让您知道损坏的 HQL。