hom*_*ast 52 sql nhibernate fluent-nhibernate
我知道如何使用show_sql配置选项在运行时将SQL记录到log4net/NLog/trace窗口.
我正在寻找的是一种给Query<T>()NHibernate检索生成的SQL的方法.
我查看了Persister类,Drivers,不同的拦截器和事件.有很多地方可以看,即使缩小搜索范围也会有很大的帮助.
Ger*_*ard 97
您可以使用以下方法获取生成的SQL查询而不执行:
对于NHibernate.Linq查询:
public String GetGeneratedSql(System.Linq.IQueryable queryable, ISession session)
{
var sessionImp = (ISessionImplementor) session;
var nhLinqExpression = new NhLinqExpression(queryable.Expression, sessionImp.Factory);
var translatorFactory = new ASTQueryTranslatorFactory();
var translators = translatorFactory.CreateQueryTranslators(nhLinqExpression, null, false, sessionImp.EnabledFilters, sessionImp.Factory);
return translators[0].SQLString;
}
Run Code Online (Sandbox Code Playgroud)
对于Criteria查询:
public String GetGeneratedSql(ICriteria criteria)
{
var criteriaImpl = (CriteriaImpl) criteria;
var sessionImpl = (SessionImpl) criteriaImpl.Session;
var factory = (SessionFactoryImpl) sessionImpl.SessionFactory;
var implementors = factory.GetImplementors(criteriaImpl.EntityOrClassName);
var loader = new CriteriaLoader((IOuterJoinLoadable) factory.GetEntityPersister(implementors[0]), factory, criteriaImpl, implementors[0], sessionImpl.EnabledFilters);
return loader.SqlString.ToString();
}
Run Code Online (Sandbox Code Playgroud)
对于QueryOver查询:
public String GetGeneratedSql(IQueryOver queryOver)
{
return GetGeneratedSql(queryOver.UnderlyingCriteria);
}
Run Code Online (Sandbox Code Playgroud)
对于Hql查询:
public String GetGeneratedSql(IQuery query, ISession session)
{
var sessionImp = (ISessionImplementor)session;
var translatorFactory = new ASTQueryTranslatorFactory();
var translators = translatorFactory.CreateQueryTranslators(query.QueryString, null, false, sessionImp.EnabledFilters, sessionImp.Factory);
return translators[0].SQLString;
}
Run Code Online (Sandbox Code Playgroud)