我需要将以下 C# 代码转换为有效的实体框架 6 表达式:
(f => f.GetType().GetProperty(stringParamter).GetValue(f).ToString() == anotherStringParameter)
这家伙是为"排序"部分做的,但我似乎无法弄清楚"在哪里"部分......
一般来说,我在这里试图实现的是一种动态查询形式,用户将"选择"属性以在"dropbox"中进行过滤,提供过滤器值并点击查询......通常人们确实喜欢f => f.TargetProp == userValue
但当我不知道它是哪一个时,我就做不到......
您需要构造表示对属性的访问的表达式树:
public static Expression<Func<T, bool>> PropertyEquals<T>(
string propertyName, string valueToCompare)
{
var param = Expression.Parameter(typeof(T));
var body = Expression.Equal(Expression.Property(param, propertyName)
, Expression.Constant(valueToCompare));
return Expression.Lambda<Func<T, bool>>(body, param);
}
这允许您编写:
query = query.Where(PropertyEquals<EntityType>(stringParameter, anotherString));
您是否考虑过使用动态链接库? 它允许您将表达式组合为字符串而不是 lambda 表达式。
例子:
var query = baseQuery.Where("Id=5");
var query = baseQuery.Where("Id=@0", 5);
我一直在 https://github.com/NArnott/System.Linq.Dynamic 保留Microsoft的动态 Linq 示例的更新版本,以防您感兴趣,并且在 NuGet 上也可用。