Я знаю, что можно просмотреть NHibernate, генерировал SQL путем сцепления его до log4net или передачи по каналу его к консоли ("show_sql" опция), но там какой-либо способ получить сгенерированный SQL в коде во времени выполнения?
То, что я хотел бы смочь сделать, является взятием объект ICriteria (или IQuery), и выведите сгенерированный SQL на экран или пользовательский журнал (не log4net). Что-то как...
var sql = criteria.GetGeneratedSql() // Wishful thinking
Что-то вроде этого может быть сделано?
Править: Благодаря превосходной находке DanP "В спящем режиме Критерии к классу" Перевода SQL для Java, я взял первую трещину при портировании этого к NHibernate. Кажется, работает на простые случаи, но определенно мог использовать некоторое улучшение (т.е. обработка ошибок, и т.д.)
using NHibernate.Engine;
using NHibernate.Hql.Ast.ANTLR;
using NHibernate.Impl;
using NHibernate.Loader;
using NHibernate.Loader.Criteria;
using NHibernate.Persister.Entity;
public class HibernateHqlAndCriteriaToSqlTranslator
{
public HibernateHqlAndCriteriaToSqlTranslator() { }
public ISessionFactory SessionFactory { get; set; }
public string ToSql(ICriteria criteria)
{
var c = (CriteriaImpl) criteria;
var s = (SessionImpl)c.Session;
var factory = (ISessionFactoryImplementor)s.SessionFactory;
String[] implementors = factory.GetImplementors(c.EntityOrClassName);
var loader = new CriteriaLoader(
(IOuterJoinLoadable)factory.GetEntityPersister(implementors[0]),
factory,
c,
implementors[0],
s.EnabledFilters);
return ((OuterJoinLoader)loader).SqlString.ToString();
}
public string ToSql(string hqlQueryText)
{
if (!String.IsNullOrEmpty(hqlQueryText))
{
var translatorFactory = new ASTQueryTranslatorFactory();
var factory = (ISessionFactoryImplementor) this.SessionFactory;
var translator = translatorFactory.CreateQueryTranslator(
hqlQueryText,
hqlQueryText,
new Dictionary(),
factory);
translator.Compile(new Dictionary(), false);
return translator.SQLString;
}
return null;
}
}
Вот статья, описывающая, как получить базовый sql из hql или criteria в Hibernate; я полагаю, что перенести это на использование NHibernate не будет слишком сложно:
http://narcanti.keyboardsamurais.de/hibernate-criteria-to-sql-translation.html
Раньше я мог просматривать код, сгенерированный и отправленный в SQL в спящем режиме с помощью инструмента SQL Profiler. В зависимости от ваших целей, он может предоставить то, что вам нужно.