如何修改C# FilterBy扩展方法使其支持lambda访问对象子属性过滤
问题根源
你现有代码的问题在于仅提取了属性访问路径最末端的属性名,直接在根参数对象上访问该属性,完全丢失了嵌套属性的层级访问逻辑,所以遇到子对象属性访问的场景就会报错。
修复方案
不需要手动拆解属性表达式的结构,直接复用传入的属性访问表达式本身的完整逻辑即可,修改后的代码如下:
public static IQueryable<TSource> FilterBy<TSource, TProp>(this IQueryable<TSource> source, Expression<Func<TSource, TProp>> property, TProp value) { if (value != null) { // 直接构造相等比较:属性访问表达式 == 值常量 var equalBody = Expression.Equal( property.Body, Expression.Constant(value, typeof(TProp)) ); // 复用原属性表达式的参数,保证参数匹配 var predicate = Expression.Lambda<Func<TSource, bool>>(equalBody, property.Parameters); source = source.Where(predicate); } return source; }
方案优势
- 自动支持任意层级的嵌套属性访问,不管是
obj.MyProp还是obj.Child.GrandChild.Prop都能正常工作 - 不需要手动处理MemberExpression拆解、类型转换等边界情况,所有逻辑都由传入的属性表达式自带
- 完全兼容原来的所有调用场景,不需要修改已有调用代码
内容的提问来源于stack exchange,提问作者arkord
相关产品推荐
相关产品推荐

