我想让用户选择不同属性的搜索。例如
[输入文本] | [选择选项{ID,NAME,PHONE}] | [检索]
我稍后会像这样构建我的查询:
repository.Where(lambda-expression)
从所选选项{ID,NAME,PHONE}构建lambda表达式 (例如:x => x.NAME.Equals(INPUT TEXT))
是否可以使用反射从Property属性构建lambda?
由于
答案 0 :(得分:21)
您不构建lambda表达式 - 您构建表达式树。这不是很难,但需要一点耐心。在您的样本中,您可能需要:
ParameterExpression parameter = Expression.Parameter(typeof(Foo), "x");
Expression property = Expression.Property(parameter, propertyName);
Expression target = Expression.Constant(inputText);
Expression equalsMethod = Expression.Call(property, "Equals", null, target);
Expression<Func<Foo, bool>> lambda =
Expression.Lambda<Func<Foo, bool>>(equalsMethod, parameter);
这是假设:
Foo
propertyName
inputText
答案 1 :(得分:3)
对于那种事情,我使用类似的东西(注意:做“喜欢”的地方):
public static IQueryable<TEntity> Where<TEntity>(this IQueryable<TEntity> source, string propertyName, string value)
{
Expression<Func<TEntity, bool>> whereExpression = x => x.GetType().InvokeMember(propertyName, BindingFlags.GetProperty, null, x, null).ObjectToString().IndexOf(value, StringComparison.InvariantCultureIgnoreCase) >= 0;
return source.Where(whereExpression);
}
答案 2 :(得分:2)
我不得不面对同样的问题,以下方法完美地解决了我的问题。
PropertyInfo propertyInfoObj = MyClassObject.GetType().GetProperty(PropertyName);
repository.Where(x => propertyInfoObj.GetValue(x) == SearchValue).Select(x => propertyInfoObj.GetValue(x)).FirstOrDefault();