我需要将以下C#代码转换为有效的Entity Framework 6表达式:
(f => f.GetType().GetProperty(stringParamter).GetValue(f).ToString() == anotherStringParameter)
This guy为" Order By"部分,但我似乎无法弄清楚"其中"部分...
一般来说,我想在这里实现的是一种动态查询形式,用户将选择"要在" dropbox"中过滤的属性,提供过滤器值和点击查询...通常人们会喜欢f => f.TargetProp == userValue
但是当我不知道它是哪一个时我无法做到是...
答案 0 :(得分:6)
您需要构造表示对属性的访问的表达式树:
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));
答案 1 :(得分:1)
您是否考虑过使用动态链接库?它允许您将表达式组合为字符串而不是lambda表达式。
示例:
var query = baseQuery.Where("Id=5");
var query = baseQuery.Where("Id=@0", 5);
如果您感兴趣,我一直在https://github.com/NArnott/System.Linq.Dynamic保留微软Dynamic Linq示例的更新版本,并且它也可以在NuGet上使用。