我有这个:
// selectedOptions Contains a list of string constants
var selectedOptions = new List<string>(...);
Expression<Func<T, bool>> condition = null;
switch (propertyName)
{
case "Property1":
condition = x => selectedOptions.Contains(x.Property1);
break;
case "Property1":
condition = x => selectedOptions.Contains(x.Property2);
break;
case "Property3":
condition = x => selectedOptions.Contains(x.Property3);
break;
}
该条件将用作Linq to Entities中Where()的谓词。
我们的想法是让EF生成类似于where Property1 in (...)
的SQL。
我不知道是否有更好的方法可以做到这一点,但它确实有效。
我的问题是我想要消除这个开关,并且有以下几点:
condition = x => selectedOptions.Contains(x.[propertyName]);
有可能吗?
答案 0 :(得分:1)
是的,有可能:
var parameter = Expression.Parameter(typeof(T));
var containsMethod = typeof(List<string>).GetMethod("Contains");
var property = Expression.Property(parameter, propertyName);
var body = Expression.Call(Expression.Constant(selectedOptions), containsMethod, property);
condition = Expression.Lambda<Func<T, bool>>(body, parameter);
这是手工构建表达式树。