Выбор сверху с использованием пользовательского диалекта NHibernate для базы данных OpenEdge не работает

Я сделал собственный диалект, чтобы иметь возможность использовать NHibernate с базой данных Progress/OpenEdge через ODBC. В большинстве случаев диалект работает нормально, но у меня проблема с операторами SELECT TOP. Проблема в том, что операторы генерируются следующим образом с количеством столбцов, возвращаемых в качестве параметра:

SELECT TOP ? SomeColumn
FROM SomeTable
where SomeColumn = ?; p0 = 100, p1 = 'test'

База данных Progress/Openedge не поддерживает это, поэтому я хотел бы внести некоторые изменения в диалект, заставив оператор не использовать параметры для количества столбцов в SELECT TOP - например:

SELECT TOP 100 SomeColumn
FROM SomeTable
where SomeColumn = ?; p0 = 'test'

Это возможно?

Кстати, я использую NHibernate v. 3.3.1


person BackendA    schedule 12.07.2012    source источник


Ответы (1)


Просмотрев исходный код NHibernate, Я бы сказал, что вам нужно переопределить свойство SupportsVariableLimit, чтобы вернуть false.

/// <summary>
/// Can parameters be used for a statement containing a LIMIT?
/// </summary>
public override bool SupportsVariableLimit
{
    get { return false; }
}

Изменить

К сожалению, кажется что NHibernate Linq не использует свойство SupportsVariableLimit. Он всегда пытается использовать параметры.

Вот обсуждение по этому поводу с исправлением исходного кода. .

person Miroslav Popovic    schedule 12.07.2012
comment
Я пробовал это, но затем я получаю исключение из метода Dialect.GetLimitString, говорящее, что Dialect не поддерживает ограничения переменных. - это происходит потому, что параметр limitparameter не равен нулю, а параметр limit равен нулю... - person BackendA; 12.07.2012