Вопрос по nhibernate, sql – Как я могу иметь NHibernate только генерировать SQL без его выполнения?

49

Я знаю, как записать SQL в окно log4net / NLog / trace во время выполнения сshow_sql Вариант конфигурации.

То, что я ищу, - это способ датьQuery<T>() NHibernate получить сгенерированный SQL.

Я просмотрел класс Персистера, Водителей, различные Перехватчики и События. Есть так много мест, где можно поискать, и даже сужение моего поиска очень поможет.

То, что я пытаюсь сделать, - это своего рода профилировщик для бедного человека. Я просто хочу знать, как конкретный запрос linq будет оцениваться из части тестового кода. hometoast

Ваш Ответ

2   ответа
95

ю следующих методов:

Для запросов 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;
}
Error: User Rate Limit ExceededCreateQueryTranslatorsError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededGetGeneratedSql(ICriteria criteria)Error: User Rate Limit Exceeded?)?
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededstackoverflow.com/questions/10786934/…Error: User Rate Limit Exceeded
1

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

         var sql = translators.First().SQLString;
         var formamttedSql = FormatStyle.Basic.Formatter.Format(sql);
         int i = 0;
         var map = ExpressionParameterVisitor.Visit(queryable.Expression, sessionImp.Factory).ToArray();
         formamttedSql = Regex.Replace(formamttedSql, @"\?", m => map[i++].Key.ToString().Replace('"', '\''));

         return formamttedSql;
      }
Error: User Rate Limit Exceeded

Похожие вопросы