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

C# 如何动态创建以下LINQ表达式?,c#,linq,entity-framework,lambda,entity-framework-6,C#,Linq,Entity Framework,Lambda,Entity Framework 6,我需要将以下C#代码转换为有效的实体框架6表达式: (f => f.GetType().GetProperty(stringParamter).GetValue(f).ToString() == anotherStringParameter) 是为“订购方式”部分做的,但我似乎无法为“地点”部分找到答案 一般来说,我在这里尝试实现的是一种动态查询形式,用户将在“dropbox”中“选择”要筛选的属性,提供筛选值并点击查询。。。通常人们喜欢f=>f.TargetProp==userValu

我需要将以下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);
}
publicstaticexpressionpropertyquals(
字符串属性名称,字符串值比较)
{
var param=表达式参数(typeof(T));
var body=Expression.Equal(Expression.Property(param,propertyName)
常量(valueToCompare));
返回表达式.Lambda(body,param);
}
这允许您编写:

query = query.Where(PropertyEquals<EntityType>(stringParameter, anotherString));
query=query.Where(PropertyEquals(stringParameter,另一个字符串));

您需要构造表示对属性访问的表达式树:

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);
}
publicstaticexpressionpropertyquals(
字符串属性名称,字符串值比较)
{
var param=表达式参数(typeof(T));
var body=Expression.Equal(Expression.Property(param,propertyName)
常量(valueToCompare));
返回表达式.Lambda(body,param);
}
这允许您编写:

query = query.Where(PropertyEquals<EntityType>(stringParameter, anotherString));
query=query.Where(PropertyEquals(stringParameter,另一个字符串));

您是否考虑过使用动态链接库?它允许您将表达式组合为字符串,而不是lambda表达式

示例:

var query = baseQuery.Where("Id=5");

var query = baseQuery.Where("Id=@0", 5);

我一直将Microsoft的动态Linq示例的更新版本保存在,以备您感兴趣,并且它也可以在NuGet上获得。

您考虑过使用动态链接库吗?它允许您将表达式组合为字符串,而不是lambda表达式

示例:

var query = baseQuery.Where("Id=5");

var query = baseQuery.Where("Id=@0", 5);

我一直将Microsoft动态Linq示例的更新版本保存在中,以防您感兴趣,它也可以在NuGet上获得。

如果我想与固定/预定义的子属性进行比较,该怎么办?like:代替
Expression.Property(param,propertyName)
类似
Expression.Property(param,propertyName.Title)
@Leonardo,然后使用两个
Expression.Property
调用来访问上一次属性访问结果的固定属性。如果要与固定/预定义的子属性进行比较,该怎么办?比如:代替
Expression.Property(param,propertyName)
类似
Expression.Property(param,propertyName.Title)
@Leonardo然后使用两个
Expression.Property
调用来访问先前属性访问结果的固定属性。我不知道!我去看看!我不知道!我去看看!