【发布时间】:2013-09-06 17:28:19
【问题描述】:
给定一个具有字典属性的类
public class Product
{
public Dictionary<string, string> Attributes { get { return attributes; } }
private Dictionary<string, string> attributes = new Dictionary<string, string>();
}
我希望能够根据从数据存储中检索到的标准匹配产品列表中的产品,该标准采用以下格式
Brand == Tyco
Color != Blue
我目前的方法是从过滤器构造一个表达式,然后将该表达式作为参数传递给 LINQ Where 方法调用,就像这样
products = products.Where(myConstructedExpression);
myConstructedExpression 通常是一个看起来像这样的 lamda 表达式
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);
问题
- 这是否是一种合理的方法,如果是,
- 如何构造左表达式?
【问题讨论】:
-
你为什么要使用表达式树?为什么 lambda 还不够?
-
因为我不知道过滤器会是什么。具体来说,我不知道运营商会是什么。我必须在运行时决定它是否将是 ==、!=、、= 等。而且,我不能将任意运算符传递给 lambda 表达式。
标签: c# linq lambda expression expression-trees