sybase的NHibernate自定义方言支持限制

sybase的NHibernate自定义方言支持限制,nhibernate,limit,sybase,linq-to-nhibernate,dialect,Nhibernate,Limit,Sybase,Linq To Nhibernate,Dialect,我正在使用Linq2NHibernate 3.0和sybase ASE 15。 我的第一个问题是方言不支持限制(“选择top5…”)。因此,我创建了一个自定义方言来覆盖这些方法: public override bool SupportsLimit { get { return true; } } public override bool SupportsLimitOffset { get { return true; }

我正在使用Linq2NHibernate 3.0和sybase ASE 15。 我的第一个问题是方言不支持限制(“选择top5…”)。因此,我创建了一个自定义方言来覆盖这些方法:

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

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

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

    public new int GetLimitValue(int offset, int limit)
    {
          //TOOK FROM ANOTHER DIALECT
        if (limit == int.MaxValue)
            return int.MaxValue;

        if (UseMaxForLimit)
            return GetOffsetValue(offset) + limit;

        return limit;

    }

    public override SqlString GetLimitString(SqlString sql, SqlString offset, SqlString limit)
    {
        //TOOK FROM ANOTHER DIALECT EXCEPT THAT I CALL ANOTHER CUSTOM CLASS
    }
注意:我使用另一个类使用锁将限制值传递到GetLimitString(我没有找到更好的选择)

我认为它工作得很好,但是GetLimitString只调用了一次,因此,如果我更改了限制值,就不会考虑它

所以,我的问题可以通过两种方式解决:您有一种更好的Sybase自定义方言,或者您知道为什么只调用一次GetLimitString


“提前感谢”

可能是愚蠢的评论,但您是否跟踪了代码以确保只调用一次GetLimitString,并且不是您用来注入限制的机制总是返回相同的结果?是的,即使在调试中,它只被调用过一次。当我遇到这个问题时,有一个相关的注意事项:Sybase ASE不支持TOP-on-sub-select,因此在这种情况下,上面生成的SQL无效。使用当前的nhibernate API,没有方法区分选择和子选择。(除了查看调用堆栈)。有一个有效的解决方案。