2013-05-10 11 views
2

Мы используем Nhibernate 3.3 для подключения к нашей базе данных Sybase Ase 15. Все в порядке, за исключением неподдерживания лимита (или верхнего). Он реализован в sybase, но не в Nhibernate. У вас есть решение?Как реализовать ограничение с Nhibernate и Sybase

Я попытался создать CustomSybaseAse15Dialect, где я изменить это:

 public override bool SupportsLimitOffset 
{ 
    get { return true; } 
} 

public override SqlString GetLimitString(SqlString sql, SqlString offset, SqlString limit) 
{  
    int insertionPoint = GetAfterSelectInsertPoint(sql); 

    if (insertionPoint > 0) 
    { 
     SqlStringBuilder limitBuilder = new SqlStringBuilder(); 
     limitBuilder.Add("select"); 
     if (insertionPoint > 6) 
     { 
      limitBuilder.Add(" distinct "); 
     } 
     limitBuilder.Add(" top "); 
     limitBuilder.Add(limit); 
     if (offset != null) 
     { 
      limitBuilder.Add(" start at "); 
      limitBuilder.Add(offset); 
     } 
     limitBuilder.Add(sql.Substring(insertionPoint)); 
     return limitBuilder.ToSqlString(); 
    } 
    else 
    { 
     return sql; // unchanged 
    } 
} 

/// <summary> 
/// Copied from MsSql2000Dialect. 
/// </summary> 
private int GetAfterSelectInsertPoint(SqlString sql) 
{ 
    if (sql.StartsWithCaseInsensitive("select distinct")) 
    { 
     return 15; 
    } 
    if (sql.StartsWithCaseInsensitive("select")) 
    { 
     return 6; 
    } 
    throw new NotSupportedException("The query should start with 'SELECT' or 'SELECT DISTINCT'"); 
} 

Используя синтаксис Linq2Nhibernate, он хорошо работает с

Session.Query<product>().First() 

предел правильно установлен на 1, но если я делаю это

Session.Query<product>().Take(3).ToList() 

ограничение установлено на «?».

Что я могу сделать?

+1

Там, как представляется, вопрос в nHibernate. Вы проверили https://groups.google.com/forum/?fromgroups=#!topic/nhibernate-development/TZVi8ce_Vfo – MoCapitan

+0

Исправить! Я сосредоточился на проблеме с sybase, но я думаю, что вы правы. Знаете ли вы, как я могу получить двоичные файлы с исправлениями или возможным обходным путем? – Eric

ответ

0

как упоминалось в предыдущем комментарии, есть ошибка в nHibernate. Он уже исправлен, но еще не включен в официальную версию.

https://nhibernate.jira.com/browse/NH-3281

Вы можете скачать главный источник и построить библиотеку DLL вручную из https://github.com/nhibernate/nhibernate-core.

Майкл

0

Для тех, кто найти этот вопрос в последнее время:

Это фиксируется в релизной версии NHibernate 4.1.

Кроме того, необходимо добавить в диалекте:

public override bool SupportsVariableLimit { get { return false; } } 

для решения проблемы отсутствия поддержки заполнителей «выберите верхний X» (это по умолчанию то, что SupportsLimit есть)

Смежные вопросы