2016-03-27 7 views
0

からプロパティ値を取得します。要件を説明してください。 上記のコードでは、プロパティは実行時に解決される必要があります。言い換えれば、スティング値からプロパティにアクセスする必要があります。"ProductName"C#ラムダ式ラムダ式を、次の点を考慮文字列

どうすればいいですか?その後

::これは、データベースを照会するEntity Frameworkのでは動作しませんが、あなたは持っていないので、ということ

IQueryable<Product> query = query.Where(x => x.GetPropertyValue<string>("ProductName").Contains("P100")); 

は注意してくださいあなたはこの拡張メソッドを持つことができます

+0

私はこのメソッドをより一般的にする必要があることを意味します。私のアプリケーションロジックによると、私は文字列値としてのプロパティ名しか持っていません。だから私はプロパティとして文字列を解決する必要があります。 – Rahul

+0

クエリプロセッサとは何ですか? 'Product'オブジェクトに対して' GetPropertyValue() 'メソッドを使うことをサポートしますか?サポートされていない場合は、変換を行うことに意味がありません。 –

+1

あなたはLinq Expressionsを学ぶ必要があるか、Dynamic Linqを使う必要があります。 – Aron

答えて

4
var parameterExp = Expression.Parameter(typeof(Product), "type"); 
var propertyExp = Expression.Property(parameterExp, propertyName); 
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); 
var someValue = Expression.Constant(propertyValue, typeof(string)); 
var containsMethodExp = Expression.Call(propertyExp, method, someValue); 

Expression<Func<Product, bool>> predicate = Expression.Lambda<Func<T, bool>> 
      (containsMethodExp, parameterExp); 


var query = query.Where(predicate); 
+0

これは簡単にlinq 'where'を含むビットなしで呼び出すことができますか? –

+0

@DouglasGaskell包含ビットがないとどういう意味ですか?上記のコードは、CLRなしで純粋なLinq式ツリーを生成するためのコードです。このクエリは、EFやnHiberateのようなCLRではないプロバイダを含むほとんどのLinqプロバイダで実行できます。 – Aron

0

エンティティフレームワークで質問をタグ付けしましたが、私はあなたがそれを使用していると仮定していません。

+0

私はOdataクライアントコードジェネレータでOdata V4を使用しています。これは動作しますか? – Rahul

+0

私はそれを一度も使ったことはありませんが、わかりませんが、それが問題に関係しているならば、それを指定しておくべきです(少なくとも質問にタグを付ける必要があります) – Jcl