2012-03-29 50 views
2

我正在使用一個S#arp架構項目,該項目包含一些過去曾工作的數據庫任務。具體做法是:NHibernate:DB2400Dialect:Dialect不支持變量限制

var principals = _principalTasks.GetAll().AsPagination(page, limit); 

其中任務被定義爲:

public IQueryable<Principal> GetAll() 
    { 
     return _principalRepository.FindAll().OrderBy(o => o.PrincipalName.ToLower()); 
    } 

這是有效地利用NHibernate.Linq。

這是使用DB2400Dialect。現在它拋出:

System.NotSupportedException: Dialect does not support variable limits. 
    at NHibernate.Dialect.Dialect.GetLimitString(SqlString queryString, Nullable`1 offset, Nullable`1 limit, Parameter offsetParameter, Parameter limitParameter) 
    at NHibernate.Hql.Ast.ANTLR.SqlGenerator.GetSqlStringWithLimitsIfNeeded(QueryWriter queryWriter) 
    at NHibernate.Hql.Ast.ANTLR.SqlGenerator.EndQuery() 
    at NHibernate.Hql.Ast.ANTLR.SqlGenerator.selectStatement() 
    at NHibernate.Hql.Ast.ANTLR.SqlGenerator.statement() 
    at NHibernate.Hql.Ast.ANTLR.HqlSqlGenerator.Generate() 
    . 
    . 
    . 

它看起來像SQLGenerator堅持參數化該方言不支持的跳過和參數。

有沒有辦法解決這個問題還是這是一個NHibernate的bug?

編輯:

順便說一句,這是從NHibernate.Linq.DefaultQueryProvider電話表達調試字符串:

.Call System.Linq.Queryable.Take(
    .Call System.Linq.Queryable.Skip(
     .Call System.Linq.Queryable.OrderBy(
      .Constant<NHibernate.Linq.NhQueryable`1[SolutionExample.Domain.Principal]>(NHibernate.Linq.NhQueryable`1[SolutionExample.Domain.Principal]), 
      '(.Lambda #Lambda1<System.Func`2[SolutionExample.Domain.Principal,System.String]>)), 
     0), 
    25) 

.Lambda #Lambda1<System.Func`2[SolutionExample.Domain.Principal,System.String]>(SolutionExample.Domain.Principal $o) { 
    .Call ($o.PrincipalName).ToLower() 
} 

回答

3

大量的研究後,我已經決定,而我既可以由解決這個問題創建自己的自定義方言實現 - 或者擴展現有DB2400Dialect實現 -

public SqlString GetLimitString(SqlString queryString, int? offset, int? limit, Parameter offsetParameter, Parameter limitParameter) 

,這將是毫無意義的,因爲當i系列允許與

... FETCH FIRST n ROWS ONLY 

語法的限制,它有這樣做的偏移......所以,沒有太多的點固定破位沒有相應的語法。

+0

我剛剛試圖建立一個測試臺。我花了一段時間才弄清楚你在問題和答案中所說的話。在花費了幾個小時左右的時間,通過調試器和所有東西,我終於明白你的意思了。雖然,這似乎只是使用linq提供程序的一個問題(這對我來說是不幸的,因爲使用linq是我的練習的重點)。 – 2014-01-22 23:50:18