18 votos

¿Cómo puedo tener NHibernate sólo generar el SQL sin ejecutar?

Sé cómo iniciar el SQL para log4net/NLog/de la ventana de seguimiento en tiempo de ejecución con el show_sql opción de configuración.

Lo que estoy buscando es una manera de dar un Query<T>() de NHibernate recuperar el SQL generado.

He mirado a través de la clase Almacenador, los Conductores, los diferentes Interceptores y Eventos. Hay muchos lugares para ver, incluso estrechando mi búsqueda sería de gran ayuda.

32voto

Gerard Puntos 1289

Usted puede obtener el código sql generado consultas sin la ejecución con los siguientes métodos:

Para el Fluent.Las consultas de Linq:

public String GetGeneratedSql(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.Key, nhLinqExpression, null, false, sessionImp.EnabledFilters, sessionImp.Factory);

    return translators[0].SQLString;
}

Para consultas de Criterios:

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();
}

Para QueryOver consultas:

public String GetGeneratedSql(IQueryOver queryOver)
{
    return GetGeneratedSql(queryOver.UnderlyingCriteria);
}

Para consultas 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;
}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: