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.