Добавить параметры запроса SQL в запрос NHibernate - PullRequest
0 голосов
/ 27 августа 2010

Я работаю с некоторым кодом, который генерирует запросы ICriteria для NHibernate.Они выполняются с использованием ActiveRecord и ActiveRecordMediator.Есть ли быстрый способ, которым я могу сделать это?

Я не хочу переписывать запросы с использованием простого SQL.Ну, я бы с удовольствием, но они слишком сложные.Но если, например, есть простой способ перехватить и изменить SQL-код до его откачки на SQL-сервер, я был бы счастлив.

Ответы [ 2 ]

4 голосов
/ 28 августа 2010

Реализация IInceptceptor и внесение изменений в OnPrepareStatement ().Затем передайте ваш перехватчик ISessionFactory.OpenSession ().

Вот пример .

Или вы можете попробовать зарегистрировать пользовательскую функцию на своем диалекте.(* 1 007 * Пример )

3 голосов
/ 30 декабря 2010

Хотя ответ Маурисио Шеффера чрезвычайно полезен, я решил дополнить его рабочим примером для реализации Interceptor для использования с NHibernate и Castle Active Records.

Перехватчик

using NHibernate;
using NHibernate.SqlCommand;

namespace Common.FTS
{

public class FtsHashInterceptor : EmptyInterceptor
{
    private static FtsHashInterceptor instance = new FtsHashInterceptor();

    protected FtsHashInterceptor() { }

    public static FtsHashInterceptor Instance
    {
        get { return instance; }
        set { instance = value; }
    }

    public override SqlString OnPrepareStatement(SqlString sql)
    {
        return sql.Replace("inner join Product fts1_", "inner hash join Product fts1_");
    }
}
}

Подключение перехватчика с устройством

using Castle.ActiveRecord.Framework;
using Castle.Core.Configuration;
using Castle.MicroKernel;
using NHibernate;

namespace Common.FTS
{
/// 
/// Allows for the system to pick up the audit facility which will be used to
/// audit all transactions in the system.
/// 
public class FtsHashFacility : IFacility
{
    #region IFacility Members

    public void Init(IKernel kernel, IConfiguration facilityConfig)
    {
        InterceptorFactory.Create = new InterceptorFactory.CreateInterceptor(CreateFtsHashInterceptor);
    }

    public void Terminate()
    {
        // Nothing to terminate
    }

    #endregion

    private IInterceptor CreateFtsHashInterceptor()
    {
        return FtsHashInterceptor.Instance;
    }
}
}

Класс выше создает объект для активной записи. Мы связываем это в файле Global.asax.cs следующим образом:

static private IWindsorContainer _container;

protected void Application_Start(object sender, EventArgs e)
{
try
{
    _container = new WindsorContainer(Server.MapPath("~/config/windsor.config"));
    var app = _container.Resolve();
    app.RegisterFacilities(_container);
    app.RegisterComponents(_container);
}
}

В файле Application.cs мы добавляем средство следующим образом:

public void RegisterFacilities(IWindsorContainer container)
{
container.AddFacility("fts.support", new FtsHashFacility());
}

Заключение Контейнер теперь содержит средство, которое подключит перехватчик Полнотекстовый поиск , который будет перехватывать все вызовы ActiveRecordMediator.

Мы не изменили строку кода в нашей существующей системе, но мы добавили возможность анализировать все наши операции SQL-запросов простым, но эффективным способом.

Особая благодарность Донну Фелкеру

...