2013-05-10 18 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 2013-05-10 09:24:26

+0

正確!我專注於sybase的問題,但我認爲你是對的。你知道我怎麼能得到更正的二進制文件或可能的解決方法? – Eric 2013-05-10 09:52:30

回答

0

對於任何人最近發現了這個問題:

這是固定在NHibernate的4.1發行版。

您還需要添加到方言:

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

,以解決缺乏在「選擇頂部X」佔位符支持(默認爲任何SupportsLimit是)

相關問題