ディクショナリであるプロパティを持つクラスが与えられた場合
public class Product
{
public Dictionary<string, string> Attributes { get { return attributes; } }
private Dictionary<string, string> attributes = new Dictionary<string, string>();
}
次の形式のデータ ストアから取得した基準に基づいて、製品リスト内の製品を照合できるようにしたいと考えています。
Brand == Tyco
Color != Blue
私の現在のアプローチは、フィルターから式を作成し、その式をパラメーターとして LINQWhere
メソッド呼び出しに渡すことです。
products = products.Where(myConstructedExpression);
myConstructedExpression
通常、次のようなラムダ式はどこにありますか
p => p.Attributes[attribute] == value
テスト目的で次のコードを組み立てましたが、lambda.Compile()
式を残したために何を試しても、常に呼び出しに失敗します。
Dictionary<string, ExpressionType> expressionType = new Dictionary<string, ExpressionType>();
expressionType.Add("==", ExpressionType.Equal);
expressionType.Add("!=", ExpressionType.NotEqual);
string filter = "Brand == Tyco";
string[] fields = filter.Split(' ');
string attribute = fields[0];
string op = fields[1];
string value = fields[2];
Product product = new Product();
product.Attributes.Add("Brand", "Tyco");
var parameter = Expression.Parameter(typeof(Product), "p");
var left = /***** THIS IS WHAT I AM FAILING TO CONSTRUCT PROPERLY ********/
var right = Expression.Constant(value);
var operation = Expression.MakeBinary(expressionType[op], left, right);
var lambda = Expression.Lambda<Func<Product, bool>>(operation, parameter);
var result = lambda.Compile()(product);
質問
- これは合理的なアプローチでさえありますか? もしそうなら、
- 左の式を作成するにはどうすればよいですか?