Lambdasを使用して「Not In」を表現するにはどうすればよいですか?
-
30-09-2019 - |
質問
私はaを作成しようとしています not in
nhlambdaextensionsを使用したnhibernate基準APIを使用した条項。ドキュメントを読むことができました 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 })))
どうすればこれを達成できますか?通常の基準APIを使用して、これを行うことができました
.Add(Restrictions.Not(Restrictions.In("z.ZoneId", new[] { 1008, 1010 })))
解決
Criterionを直接使用していません(私は通常Linq2NHを使用しています)が、単にブール波のラムダを望んでいるわけではないように見えるので、別の基準を与えることはできません。これはうまくいくかもしれませんが、私はnhがラムダの配列メンバーに問題があることを見てきました:
.Add(SqlExpression.Not<Zone>(z=>new[]{1008,1010}.Contains(z.ZoneId))
編集:がらくた。ここで起こっているのは、フレームワークが実際にラムダを使用していないため、このコンパイル中に、フレームワークがクエリを実行するプロセスで実際にそれを呼び出すことはないということです。代わりに、代表者のMSILを反射的に調べ、Lambdaの表現をリバースエンジニアリングし、SQLコマンドの文字列に変換することです。つまり、明らかに、設計者は、自分がしていること(この場合は宣言したsqlexpressionのタイプ)についてヒントを指定し、プロセスを識別するパターンを探していることで簡素化しようとするかなり複雑なプロセスです。ただし、この場合、ヒントを与えられても、フレームワークにはあなたがやろうとしていることがわかりません。
not()句を評価する背後にある翻訳者がロジックループまたはメソッド呼び出しの目的を神に神にできない場合、あなたはそれにとどまるかもしれません
.Add(SqlExpression.Not<Zone>(z=>z.ZoneId == 1008
|| z.ZoneId == 1010))
Goodnessは、Linq2nhibernateが正しく機能するためにこのように表現を煮詰めなければならなかったことを知っています。
他のヒント
ラムダと一緒に旧世界を使用することは機能しているようです:
.Add(Expression.Not(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 }));