この質問にはすでに答えがあります。
次のラムダ式を考えます。
IQueryable<Product> query = query.Where(x => x.ProductName.Contains("P100"));
上記のコードを次のように変換する必要があります。
IQueryable<Product> query = query.Where(x => x.GetPropertyValue("ProductName").Contains("P100"));
ここで私はダミーメソッドを追加しましたGetPropertyValue("ProductName")
要件を説明します。
上記のコードでは、プロパティは実行時に解決されるべきです。言い換えれば、私は文字列の値からプロパティにアクセスする必要があります。"ProductName"
これどうやってするの?
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);
where
containsビットなしで呼び出しますか? - Douglas Gaskell
あなたはこの拡張方法を持つことができます:
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ではデータベースのクエリには機能しないことに注意してください。ただし、質問にはエンティティフレームワークを使用してタグ付けしていないため、使用しているとは限りません。
GetPropertyValue()
のメソッドProduct
オブジェクト?サポートされていない場合は、変換を実行しても意味がありません。 - Jeff Mercado