2017-09-27 10 views
4

を経由して式を作成するときに私たちはIQueryable.Where()に適用されているカスタム式を構築するためにSystem.Linq.Expressions.Expressionを使用している「ブールHasFlag(System.Enum)」メソッドを認識しません。はSystem.Linq.Expressions.Expression

私が達成したいのは、.Where()式で使用されるプロパティに.HasFlag()メソッド(introduced in EF 6.1)を適用することです。

は、私は次のコードを持っている:

var memberExpression = propertyExpression as MemberExpression; 
var targetType = memberExpression?.Type ?? typeof(decimal?); 
var value = Enum.Parse(type, searchValue); 
var hasFlagMethod = targetType.GetMethod(nameof(Enum.HasFlag)); 
var hasFlagExpression = Expression.Call(propertyExpression, hasFlagMethod, Expression.Convert(Expression.Constant(value), typeof(Enum))); 

propertyExpressionの値が{x.Type}として表示されているとhasFlagMethodの両方が私に罰金を見{Boolean HasFlag(System.Enum)}として示されています。

hasFlagExpressionの値もConvert(Foo)一部を除き、私には完全に正常に見えるが、これは、私はそれはSystem.Enumがないように、パラメータは、この方法を適用することができないことを不平を言っていることを別の例外になるだろう必要otherwhiseたこと{x.Type.HasFlag(Convert(Foo))}です。

そして、我々はこの.Where()IQueryableを列挙時に、我々は例外を以下の取得:

のように(私たちはまた Enum.HasFlag()のサポートを追加したEF 6.1を使用している)ものの IQueryable作品にそれを直接呼び出す ​​

Entities.Where(x => x.Type.HasFlag(BarEnum.Foo)); 

しかし、このように呼び出すことは、すべてのエンティティに対して一般的である必要があるため、オプションではありません。あなたのコード内のHasFlag方法のMethodInfoと、コンパイラによって生成された1の間の小さなない簡単に目に見える違いはあり

答えて

3

(私たちは、DataTableの中にフィルターの列に応じて、これらの.Where()条件をまとめます)。前者の場合ReflectedTypeプロパティはtypeof(YourEnum)であり、後者の場合はtypeof(Enum)です。両方の場合のDeclaringTypeプロパティは同じです - typeof(Enum)、したがってデバッグ表示ですが、それはEFクエリトランスレータを破るのに十分です。私の財産にも列挙型であるとしてすごいああ、これは私の心に来ていないだけで

var hasFlagMethod = typeof(Enum).GetMethod(nameof(Enum.HasFlag)); 
+0

var hasFlagMethod = targetType.GetMethod(nameof(Enum.HasFlag)); 

を変更、問題を解決するには

、私はそれが動作するはずと思いました。あなたの答えをありがとう、私はすぐに仕事で明日お試しし、それがうまくいけば返信します! :-) –

+0

それは完璧に働いた、ありがとう! :-) –

関連する問題