7

not inNHLambdaExtensionsを使用してNHibernateCriteriaAPIで句を作成しようとしています。ドキュメントを読んで、私は次のことをin行うことで条項を実装することができました

.Add(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 }))

ただし、ラップするとSqlExpression.Notエラーが発生します

Error   5   The best overloaded method match for 'NHibernate.LambdaExtensions.SqlExpression.Not<oms_dal.Models.Zone>(System.Linq.Expressions.Expression<System.Func<oms_dal.Models.Zone,bool>>)' has some invalid arguments
Error   6   Argument '1': cannot convert from 'NHibernate.Criterion.ICriterion' to 'System.Linq.Expressions.Expression<System.Func<oms_dal.Models.Zone,bool>>'

私はこのコードを使用しています

.Add(SqlExpression.Not<Zone>(SqlExpression.In<Zone>(x => zoneAlias.ZoneId, new int[] { 1008, 1010 })))

どうすればこれを達成できますか?通常のCriteriaAPIを使用して、これを行うことができました

.Add(Restrictions.Not(Restrictions.In("z.ZoneId", new[] { 1008, 1010 })))
4

2 に答える 2

2

ラムダで古い世界を使用することはうまくいくようです:

.Add(Expression.Not(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 }));
于 2010-12-23T11:48:37.597 に答える
1

基準を直接操作したことはありませんが(私は通常Linq2NHを使用します)、ブールラムダが必要なだけではないように見えるため、別の基準を指定することはできません。NHがラムダの配列メンバーに問題があるのを見たことがありますが、これは機能する可能性があります。

.Add(SqlExpression.Not<Zone>(z=>new[]{1008,1010}.Contains(z.ZoneId))

編集:がらくた。ここで起こっていることは、フレームワークが実際にラムダを使用していないことです。したがって、これがコンパイルされている間、フレームワークはクエリの実行中に実際にラムダを呼び出すことはありません。代わりに、デリゲートのMSILを反射的に調べ、ラムダ式をリバースエンジニアリングし、それをSQLコマンドの文字列に変換します。つまり、明らかに、設計者が実行していること(この場合は宣言したSqlExpressionのタイプ)に関するヒントを指定し、プロセスを識別するためのパターンを探すことによって単純化しようとするかなり複雑なプロセスです。ただし、この場合、ヒントが与えられたとしても、フレームワークにはあなたが何をしようとしているのか見当がつかない。

Not()句の評価の背後にあるトランスレータが、ロジックループまたはメソッド呼び出しの目的を理解できない場合は、行き詰まる可能性があります。

.Add(SqlExpression.Not<Zone>(z=>z.ZoneId == 1008
                                || z.ZoneId == 1010))

グッドネスは、Linq2NHibernateが正しく機能するために、この方法で式を要約する必要があったことを知っています。

于 2010-09-03T19:19:50.377 に答える