如何动态创建以下LINQ表达式?

时间:2014-04-07 15:05:59

标签: c# linq entity-framework lambda entity-framework-6

我需要将以下C#代码转换为有效的Entity Framework 6表达式:

(f => f.GetType().GetProperty(stringParamter).GetValue(f).ToString() == anotherStringParameter)

This guy为" Order By"部分,但我似乎无法弄清楚"其中"部分...

一般来说,我想在这里实现的是一种动态查询形式,用户将选择"要在" dropbox"中过滤的属性,提供过滤器值和点击查询...通常人们会喜欢f => f.TargetProp == userValue但是当我不知道它是哪一个时我无法做到是...

2 个答案:

答案 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上使用。