2017-02-15 7 views
0

私のアプリケーションでは、プロパティ名とプロパティ値を持つバックエンドに 'Filter'オブジェクトを渡します。プロパティ文字列名に基づくefとの動的比較

私は、動的に行うために、インターネット上で、次のコードを見つけましたが、EF

私は、このように呼んで
public static IOrderedQueryable<T> Contains<T>(this IQueryable<T> queryable, string propertyName, string propertyValue) 
     { 
      var parameterExp = Expression.Parameter(typeof(T), "type"); 
      var propertyExp = Expression.Property(parameterExp, propertyName); 
      var method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); 
      var someValue = Expression.Constant(propertyValue, typeof(string)); 
      var containsMethodExp = Expression.Call(propertyExp, method, someValue); 

      var expression = Expression.Lambda<Func<T, bool>>(containsMethodExp, parameterExp); 

      var expcall = Expression.Call(typeof(Queryable), "Where", new[] {typeof(T)}, queryable.Expression,Expression.Quote(expression)); 

      return (IOrderedQueryable<T>)queryable.Provider.CreateQuery<T>(expcall); 
     } 

に含まれています:

query = query.Contains(filter.Property, (string)filter.Value); 

は、今私は同じことを見つけようとしています

query = query.Where(x => x.Status == filter.Value); 

x.Statusはそう

列挙型です。これを行うための比較
query = query.Where(x => x.Status.Equals(filter.Value)); 

をスロー

タイプの一定の値を作成できません 'のSystem.Object'。このコンテキストでは、プリミティブ型または列挙型のみがサポートされています

intにキャストしても、

は、だから私は、等号の代わりに「==」を実行する必要がありますが、私は、メソッド名を指定せずに1が含まれていますように含まれていたり等しいのような方法を構築する方法を知らない私が欲しいもの

、このような何か:

query = query.IsTheSame(filter.Property, (Status)filter.Value); 
+1

動作していないコードを含めてくださいと方法を説明しますコンパイルエラー?ランタイム例外?間違った結果?...?) – Richard

答えて

0

==オペレータの完全一致をチェックした場合にあなたが同等のものを使用しているが、異なるオブジェクトは、それらの間の==オペレータは偽になります。 Equalsは、類似しているが異なるオブジェクトの場合に真となる。だから私は解決策がだから私は等号の代わりに「==」を実行する必要が

query = query.Where(x => (x.Status != null) && (x.Status.Equals(val))); 
0

だろうと思いますが、私は含まれてのようなメソッド名を指定せずに1が含まれていますようにする方法を構築する方法を知っているか、していません等しい

これは実際にExpression.Equalメソッドのおかげでさらに簡単です。あなたは、このように呼んで

public static IQueryable<T> WhereEquals<T>(this IQueryable<T> source, string memberPath, object value) 
{ 
    var parameter = Expression.Parameter(typeof(T), "e"); 
    var member = memberPath.Split('.').Aggregate((Expression)parameter, Expression.PropertyOrField); 
    var predicate = Expression.Lambda<Func<T, bool>>(
     Expression.Equal(member, Expression.Constant(value)), 
     parameter); 
    return source.Where(predicate); 
} 

:ここ

は(ボーナスは、ネストされたプロパティ/フィールドを扱うと)のサンプル実装です

query = query.WhereEquals(filter.Property, filter.Value); 
関連する問題