2

我们使用 Nhibernate 3.3 连接到我们的 Sybase Ase 15 数据库。除了不支持限制(或顶部)之外,一切都很好。它是在 sybase 中实现的,但不是在 Nhibernate 中实现的。你有解决方案吗?

我尝试创建一个 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()

限制设置为“?”。

我能做些什么?

4

2 回答 2

0

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

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

您可以从https://github.com/nhibernate/nhibernate-core下载主源并手动构建 dll 。

迈克尔

于 2013-05-10T13:59:06.253 回答
0

对于最近发现此问题的任何人:

这在 nHibernate 4.1 的发布版本中得到了修复。

您还需要添加到方言:

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

解决“select top X”中对占位符的支持不足(它默认为 SupportsLimit 是什么)

于 2017-05-16T15:44:00.920 回答