未应用自定义lambda表达式

本文关键字:表达式 lambda 自定义 应用 | 更新日期: 2023-09-27 17:59:38

我有一个方法,用于检查表中列名列表中是否包含字符串列表。方法如下:

public static IQueryable<T> ContainsQuery<T>(IQueryable<T> query, IEnumerable<string> propertyNames, IEnumerable<string> propertyValues)
        {
            ParameterExpression entity = Expression.Parameter(typeof(T), "entity");
            MethodInfo containsInfo = typeof(string).GetMethod("Contains", new Type[] { typeof(string) });
            MethodInfo toLowerInfo = typeof(string).GetMethod("ToLower", new Type[] {});
            BinaryExpression masterExpression = Expression.Or(Expression.Constant(true, typeof(Boolean)), Expression.Constant(true, typeof(Boolean)));
            ConstantExpression negativeOne = Expression.Constant(-1, typeof(int));
            foreach (var propertyName in propertyNames)
            {
                foreach (var propertyValue in propertyValues)
                {
                    PropertyInfo propertyInfo = typeof(T).GetProperty(propertyName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
                    ConstantExpression valueExpression = Expression.Constant(propertyValue, typeof(string));
                    ConstantExpression caseInsensitiveComparisonExpression = Expression.Constant(StringComparison.CurrentCultureIgnoreCase, typeof(StringComparison));
                    MemberExpression propertyExpression = Expression.Property(entity, propertyInfo);
                    MethodCallExpression propertyLoweredExpression = Expression.Call(propertyExpression, toLowerInfo);
                    MethodCallExpression valueLoweredExpression = Expression.Call(valueExpression, toLowerInfo);
                    MethodCallExpression containsExpression = Expression.Call(propertyLoweredExpression, containsInfo, valueLoweredExpression);
                    masterExpression = Expression.Or(containsExpression, masterExpression); 
                }
            }
            Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(masterExpression, entity);
            return query.Where(lambda);
        }

我是这样使用它的:

qry = QueryExpressions.ContainsQuery(qry, searchCols, new List<string> {universalSearch});

当我逐步完成代码时,qry一开始是一个IQueryable select all语句。然后调用这个方法,我检查lambda,它是一个嵌套的或列表。不过,当我退出该方法时,qry仍然像以前一样是一个简单的select all语句。未应用我的lambda表达式。无论我作为universalSearch传入什么,qry都会返回整个数据集。

提前谢谢。

以下是方法执行完成后的lambda:

{entity => (entity.STAKE_COMMENT.ToLower().Contains("other".ToLower()) Or (entity.NOTES.ToLower().Contains("other".ToLower()) Or (entity.COMMENT_SOURCE.ToLower().Contains("other".ToLower()) Or (entity.STAKE_COMMENT_DATE2.ToLower().Contains("other".ToLower()) Or (entity.COMMENT_STATUS.ToLower().Contains("other".ToLower()) Or (entity.COMMENT_CATEGORY.ToLower().Contains("other".ToLower()) Or (entity.COMMENTTOPIC.ToLower().Contains("other".ToLower()) Or (entity.STAKEHOLDER.ToLower().Contains("other".ToLower()) Or (True Or True)))))))))}

未应用自定义lambda表达式

问题不在于查询没有变化,而在于谓词有缺陷。

您将其作为谓词:

... lots of stuff ... Or (True Or True)

包含or true的每个条件都将始终求值为true。