2012-03-29 6 views
2

私は過去に働いたいくつかのデータベースタスクを含むS#arp Architectureプロジェクトで作業しています。具体的には:NHibernate:DB2400Dialect:Dialectは変数の制限をサポートしていません

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

これは効果的NHibernate.Linqを使用している:

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

タスクは、として定義されます。

これは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のバグですか?

編集:私は、私はどちらかによって、この問題を解決することができながら、ということにしました

.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

多くの研究の後:

ところで、これはNHibernate.Linq.DefaultQueryProviderコールからの発現のデバッグ文字列があります実装して独自のカスタム方言を作成する - または実装するために、既存のDB2400Dialectを拡張 -

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

はしばらくので、無意味になることiSeriesのは、それが壊れたビットを固定オフセット...ので、存在しない多くのポイントを行うための同等の構文を持っていない、

... FETCH FIRST n ROWS ONLY 

構文を使用して制限を可能にします。

+0

私はちょうどテストベンチをセットアップしようとしてこれでちょっとだけ得た。あなたの質問と回答であなたが何を言っているかを理解するまでには、しばらく時間がかかりました。数時間かそこらの時間をかけてデバッガやすべてを実行した後、ついにあなたが何を意味するのか見ていきます。しかし、これはlinqプロバイダを使用している場合にのみ問題があるようです(Linqを使用することは私の運動の全体的なポイントであるため、私にとっては不幸です)。 –

関連する問題