Hi,
I once wrote (a long time ago) a small utility that gave me the generated 
SQL.
Not sure though how it resolves parameters (I think it did not resolve them 
at all). 
Today I simply use NHibernate Profiler to trace SQL messages.
Anyway, maybe the code is useful for you :-)


using NHibernate;
using NHibernate.Engine;
using NHibernate.Hql.Ast.ANTLR;
using NHibernate.Impl;
using NHibernate.Linq;
using NHibernate.Loader.Criteria;
using NHibernate.Persister.Entity;
using System.Collections;
using System.Collections.Generic;

namespace Base.Data.NHibernate
{
    /// <summary>
    /// Sql Utility class for Nhibernate. Generation methods were taken from
    /// 
http://stackoverflow.com/questions/10704462/how-can-i-have-nhibernate-only-generate-the-sql-without-executing-it
    /// and adapted for Nhibernate 4
    /// </summary>
    public static class SqlUtil
    {
        /// <summary>
        /// returns generated sql for linq queries
        /// </summary>
        /// <param name="queryable"></param>
        /// <param name="session"></param>
        /// <returns></returns>
        public static string GetGeneratedSql(System.Linq.IQueryable 
queryable, ISession session)
        {
            var sessionImp = (ISessionImplementor)CompatibilityUtil.Unwrap(
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;
        }

        /// <summary>
        /// returns generated sql for criteria queries
        /// </summary>
        /// <param name="criteria"></param>
        /// <param name="parameterValues"></param>
        /// <returns></returns>
        public static string GetGeneratedSql(ICriteria criteria, out object
[] parameterValues)
        {
            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);
            parameterValues = loader.Translator.GetQueryParameters().
PositionalParameterValues;
            return loader.SqlString.ToString();
        }

        /// <summary>
        /// returns generated sql for QueryOver queries
        /// </summary>
        /// <param name="queryOver"></param>
        /// <param name="parameterValues"></param>
        /// <returns></returns>
        public static string GetGeneratedSql(IQueryOver queryOver, out 
object[] parameterValues)
        {
            return GetGeneratedSql(queryOver.UnderlyingCriteria, out 
parameterValues);
        }

        /// <summary>
        /// returns generated sql for Hql queries
        /// </summary>
        /// <param name="query"></param>
        /// <param name="session"></param>
        /// <returns></returns>
        public static 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;
        }
}

regards,
peter
Am Montag, 13. Februar 2017 15:47:26 UTC+1 schrieb Jeff Buda:
>
> I wrote a simple utility that accepts a NHibernate.SQL log message and 
> converts it into a SQL statement that can be executed in a SQL client for 
> the purposes of debugging nNibernate IQueryOver's and ICriterias. 
>
> It's available here: https://github.com/budajeff/jibernate
>
> Let me know if there's a better way to do that.
>
> Thanks
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/d/optout.

Reply via email to