1

この質問にはすでに答えがあります。

次のラムダ式を考えます。

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

上記のコードを次のように変換する必要があります。

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

ここで私はダミーメソッドを追加しましたGetPropertyValue("ProductName")要件を説明します。 上記のコードでは、プロパティは実行時に解決されるべきです。言い換えれば、私は文字列の値からプロパティにアクセスする必要があります。"ProductName"

これどうやってするの?


  • 私はこの方法をもっと一般的にしなければならないことを意味します。私のアプリケーションロジックによると、私は文字列値としてプロパティ名だけを持っています。だから私はプロパティとして文字列を解決する必要があります。 - Rahul
  • クエリプロセッサは何ですか。それを使用してもサポートしますかGetPropertyValue()のメソッドProductオブジェクト?サポートされていない場合は、変換を実行しても意味がありません。 - Jeff Mercado
  • Linq式を学ぶか、Dynamic Linqを使う必要があります。 - Aron
  • @DavidG Reflectionを使用してもほとんどのLinqプロバイダで機能しないことを考えると、これはあなたが参照しているものとは全く異なる質問です。 - Aron

2 답변


5

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);


  • これを簡単にlinqに簡単に転送できますかwherecontainsビットなしで呼び出しますか? - Douglas Gaskell
  • @DouglasGaskell containsビットなしでどういう意味ですか?上記のコードは、CLRなしで純粋なLinq式ツリーを生成するためのものです。これにより、このクエリをEFやnHiberateなどのCLR非対応プロバイダを含むほとんどのLinqプロバイダで実行できます。 - Aron

0

あなたはこの拡張方法を持つことができます:

public static T GetPropertyValue<T>(this Product product, string propName)
{
   return (T)typeof(Product).GetProperty(propName).GetValue(product, null);
}

その後:

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

これはEntity Frameworkではデータベースのクエリには機能しないことに注意してください。ただし、質問にはエンティティフレームワークを使用してタグ付けしていないため、使用しているとは限りません。


  • Odata V4とOdata Clientコードジェネレータを使用しています。これは機能しますか? - Rahul
  • 私はそれを使ったことがない、私は知らないが、それが質問に関連しているなら(そしてそれがそうであれば)、あなたはそれを指定するべきであった(または少なくとも質問にタグを付けた) - Jcl

リンクされた質問


関連する質問

最近の質問