如何使用Nhibernate和Sybase实现limit

如何使用Nhibernate和Sybase实现limit,nhibernate,limit,linq-to-nhibernate,sap-ase,Nhibernate,Limit,Linq To Nhibernate,Sap Ase,我们使用Nhibernate 3.3连接到Sybase Ase 15数据库。除了不支持限制(或顶部)外,一切正常。它在sybase中实现,但不在Nhibernate中实现。 你有解决办法吗 我试图创建一个CustomSybaseAse15方言,我在其中更改了以下内容: public override bool SupportsLimitOffset { get { return true; } } public override SqlString GetLimitStrin

我们使用Nhibernate 3.3连接到Sybase Ase 15数据库。除了不支持限制(或顶部)外,一切正常。它在sybase中实现,但不在Nhibernate中实现。 你有解决办法吗

我试图创建一个CustomSybaseAse15方言,我在其中更改了以下内容:

     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'");
}
public override bool SupportsLimitOffset
{
获取{return true;}
}
公共重写SqlString GetLimitString(SqlString sql、SqlString偏移量、SqlString限制)
{    
int insertionPoint=GetAfterSelectInsertPoint(sql);
如果(插入点>0)
{
SqlStringBuilder limitBuilder=新的SqlStringBuilder();
limitBuilder.添加(“选择”);
如果(插入点>6)
{
limitBuilder.添加(“独特”);
}
limitBuilder.添加(“顶部”);
limitBuilder.Add(limit);
如果(偏移量!=null)
{
limitBuilder.Add(“起点”);
limitBuilder.Add(偏移量);
}
limitBuilder.Add(sql.Substring(insertionPoint));
返回limitBuilder.ToSqlString();
}
其他的
{
返回sql;//未更改
}
}
/// 
///复制自MSSQLS2000方言。
/// 
私有int GetAfterSelectInsertPoint(SqlString sql)
{
if(sql.startswithcase不敏感(“选择不同”))
{
返回15;
}
if(sql.startswithcase不敏感(“选择”))
{
返回6;
}
抛出新的NotSupportedException(“查询应以'SELECT'或'SELECT DISTINCT'开头”);
}
使用Linq2Nhibernate语法,它在

Session.Query<product>().First()
Session.Query().First()
限制正确设置为1,但如果我这样做

Session.Query<product>().Take(3).ToList()
Session.Query().Take(3.ToList())
限制设置为“?”


我能做什么?

正如前面的评论中提到的,nHibernate中有一个bug。它已被修复,但尚未包含在正式版本中

您可以从下载主源代码并手动构建dll


Michael

对于最近发现这个问题的人:

这在nHibernate 4.1的发行版中得到了修复

您还需要添加到方言中:

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

为了解决“select top X”(默认为任何SupportsLimit)中缺少占位符支持的问题

nHibernate中似乎存在一个问题。你查对了吗!我专注于sybase的问题,但我认为你是对的。你知道我如何得到带有修正或可能的解决方法的二进制文件吗?