Expression.Like 在 c# 中基于文本过滤的替代方案

Expression.Like alternative for filtering based on text in c#

我们在 c# 中没有某种 Expression.Like。因此,作为替代方案,我正在做以下工作:

private static readonly MethodInfo StringContains = typeof(string).GetMethod("Contains", new[] { typeof(string) });

然后将其与如下表达式一起使用:

var contExpressions = new List<Expression>();
var equals = nonNullValues.Select(value =>
                               (Expression) Expression.Call(left, StringContains, Expression.Constant(value, typeof(string)))).ToList();
                           contExpressions.AddRange(equals);

但是这个比较是区分大小写的。我希望表达式忽略大小写。

作为替代方案,我尝试使用如下的 indexof 方法:

private static readonly MethodInfo StringContainsIgnoreCase = typeof(string).GetMethod("IndexOf", new[] { typeof(string), typeof(StringComparison) });

并与表达式一起使用:

var equals = nonNullValues.Select(value =>
                            Expression.NotEqual(Expression.Call(left, StringContainsIgnoreCase, Expression.Constant(value, typeof(string)), Expression.Constant(StringComparison.OrdinalIgnoreCase)), Expression.Constant(-1))).ToList();
                        contExpressions.AddRange(equals);

然后尝试使最终表达式为:

var expression = Expression.Lambda<Func<T, bool>>(contExpressions.Count == 1 ? contExpressions[0] : contExpressions.Aggregate(Expression.Or), parameter);

这适用于某些情况,但对于其他情况,它会抛出异常:

LINQ could not be translated. could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync().

任何人都可以帮助我在哪里出错以及如何使用 Expression 执行不区分大小写的包含检查? 提前致谢

我能够按如下方式进行操作:

private static readonly MethodInfo StringContainsIgnoreCase =typeof(DbFunctionsExtensions).GetMethod(nameof(DbFunctionsExtensions.Like), new[] { Expression.Property(null, typeof(EF).GetProperty(nameof(EF.Functions)) ??throw new InvalidOperationException()).Type, typeof(string), typeof(string)
    });

然后使用下面的表达式:

var equals = nonNullValues.Select(value =>
                        Expression.Call(null, StringContainsIgnoreCase, Expression.Property(null, typeof(EF), nameof(EF.Functions)), left, Expression.Constant($"%{value}%", typeof(string)))).ToList();
                    contExpressions.AddRange(equals);

当您需要一个表达式来执行不区分大小写的字符串包含工作时,这就像魅力一样。