2013-05-10 74 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是)

相关问题