从属性名称作为字符串到List.Contains(x.Property)

时间:2013-05-29 14:07:42

标签: c# linq-to-entities

我有这个:

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

有可能吗?

1 个答案:

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

这是手工构建表达式树。