C# 如何动态创建以下LINQ表达式?
我需要将以下C#代码转换为有效的实体框架6表达式: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
(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
调用来访问先前属性访问结果的固定属性。我不知道!我去看看!我不知道!我去看看!