を経由して式を作成するときに私たちは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の間の小さなない簡単に目に見える違いはあり
に
を変更、問題を解決するには
、私はそれが動作するはずと思いました。あなたの答えをありがとう、私はすぐに仕事で明日お試しし、それがうまくいけば返信します! :-) –
それは完璧に働いた、ありがとう! :-) –