show_sql
構成オプションを使用して、実行時に SQL を log4net/NLog/trace ウィンドウに記録する方法を知っています。
私が探しているのは、Query<T>()
NHibernate に生成された SQL を取得する方法です。
Persister クラス、ドライバー、さまざまなインターセプター、およびイベントを調べました。見たいところがたくさんあるので、絞り込んでみるだけでも助かります。
show_sql
構成オプションを使用して、実行時に SQL を log4net/NLog/trace ウィンドウに記録する方法を知っています。
私が探しているのは、Query<T>()
NHibernate に生成された SQL を取得する方法です。
Persister クラス、ドライバー、さまざまなインターセプター、およびイベントを調べました。見たいところがたくさんあるので、絞り込んでみるだけでも助かります。
次のメソッドを使用すると、実行せずに生成された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;
}
基準クエリの場合:
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();
}
QueryOverクエリの場合:
public String GetGeneratedSql(IQueryOver queryOver)
{
return GetGeneratedSql(queryOver.UnderlyingCriteria);
}
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;
}