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);
当您需要一个表达式来执行不区分大小写的字符串包含工作时,这就像魅力一样。
我们在 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);
当您需要一个表达式来执行不区分大小写的字符串包含工作时,这就像魅力一样。