linq - 使用反射比较通用/动态 linq 谓词中的子属性

标签 linq generics reflection predicate predicatebuilder

我必须为 Entity Framework Linq 查询构建一个比较谓词。我正在使用反射,并且能够毫无问题地构建单级 Lambda 表达式。然而,我开始陷入困境的地方是我有一个有关系的实体

public class Parent {
    public virtual Child child { get; set; }
    .... Other Stuff...
}

public class Child {
    public int property { get; set; }
    public virtual Parent parent { get; set; }
    .... Other Stuff.....
}

我怎样才能将“Child.property”传递给反射,以便能够创建一个 lambda 表达式进行比较,并得出一个类似于 item => item.Child.property == value 的 lambda 表达式?

最佳答案

我想你正在寻找这个:

ParameterExpression parameter = Expression.Parameter(typeof(Parent), "item");
Expression child = Expression.PropertyOrField(parameter, "child");
Expression childProperty = Expression.PropertyOrField(child, "property");
int value = 1;
Expression comparison = Expression.Equal(childProperty, Expression.Constant(value));

Expression<Func<Parent, bool>> lambda = Expression.Lambda<Func<Parent, bool>>(comparison, parameter);


var sample = new[] { new Parent() { child = new Child() { property = 1 } } };
var result = sample.Where(lambda.Compile());

关于linq - 使用反射比较通用/动态 linq 谓词中的子属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13237382/

相关文章:

java - 嵌套泛型集合

Java 泛型 : Why does my @SuppressWarnings ("unchecked") work in this case, 而不是其他?

java - 通过反射使用类方法

c# - linq2db 在 varchar 字段中查找字符串

c# - 使用 GridView 和 LINQ to SQL 进行分页

c# - Linq 实体 4.0 ('Include' ) : In search of an elegant way

C# Linq where 子句

Java 允许泛型中的原始类型

c# - 反射类获取任何对象的所有属性

java - 通过反射检查局部变量值的变化