想做一个通用的可以动态生成表达式的方法 , 在 like 关键字卡住了 :
普通的模糊查询 ( %keyword% keyword% %keyword ) 可以通过 String.Contains String.StartWith String.EndWith 来完成,
但通常使用的模糊查询都是类似 %k%e%y%w%o%r%d% 这样的查询 ( 比如拼音查询时候按照同时按照全拼查询和首字母查询)
找了好久发现正则表达式是一个实现方式 (不知道性能效率怎么样) , 能实现以上需求 , 直接贴代码
Expression left = Expression.Property(param, property);
//........
case Define.Like:
// 模糊查询 keyword => %keyword%
filter = Expression.Call(left, typeof(string).GetMethod("Contains", new Type[] { typeof(string) }),
Expression.Constant(filterObj.Value));
break;
case Define.Similar:
{
// 模糊查询 keyword => %k%e%y%w%o%r%d%
var text = string.Empty;
for (int i = 0; i < filterObj.Value.Length; i++)
text += ".*" + filterObj.Value[i];
filter = Expression.Call(typeof(Regex),
nameof(Regex.IsMatch), null,left,
Expression.Constant(text += ".*"));
break;
}