好的,亲爱的观众朋友们,我们就前面EF+MVC动态Lamda表达式拼接(学习笔记一)接着说,前段的格式定义好了,那么我们后端怎样去实现呢?这里我也简单的做了一个小例子,那门这个例子用于解决什么场景的查询呢?请看图:
这个查询我想大家并不陌生,没错,接下来我要实现的效果就是在文本框里面支持三个字段的模糊查询,废话不多说,直接上代码:
public List<TEntity> GetList(List<ConditionLamda> conditionLamda)
{
//创建表达式的开始部分:p=>
var parameter = Expression.Parameter(typeof(TEntity), "p");
//取出类的所有字段
#region
var property_list = typeof(TEntity).GetProperties().ToList();
//取出需要作为条件查询的属性,防止因为前端误传报错
//conditionLamda = conditionLamda.Where(w => property_list.Select(p => p.Name.ToLower()).Contains(w.Property.ToLower())).ToList();
var isFirst = true;
Expression lamda = null;
//保存第一次
Expression tempLamda = null;
foreach (var item in conditionLamda)
{
var property = property_list.Where(p => p.Name.ToLower() == item.Property.ToLower()).FirstOrDefault();
if (property != null)
{
//创建我们要查询的字段:p.UserName
var para = Expression.Property(parameter, property.Name);
//给值做转换
var value = Expression.Constant(item.Value);
//运算
switch (item.Operator)
{
case "=":
{
lamda = Expression.Equal(para, value);
}
break;
case "!=":
{
lamda = Expression.NotEqual(para, value);
}
break;
case ">":
{
lamda = Expression.GreaterThan(para, value);
}
break;
case "<":
{
lamda = Expression.LessThan(para, value);
}
break;
case ">=":
{
lamda = Expression.GreaterThanOrEqual(para, value);
}
break;
case "<=":
{
lamda = Expression.LessThanOrEqual(para, value);
}
break;
case "like"://like
{
if (property.PropertyType.Name == "String")
{
lamda = Expression.Call(
Expression.Property(parameter, typeof(TEntity).GetProperty(property.Name)), //c.DataSourceName
typeof(string).GetMethod("Contains", new Type[] { typeof(string) }),// 反射使用.Contains()方法
value // .Contains(optionName) 不能使用上面组合出来的value
);
}
}
break;
default:
break;
}
if (lamda != null)
{
if (isFirst)
{
tempLamda = lamda;
isFirst = false;
}
else
{
switch (item.Join)
{
case "||":
{
lamda = Expression.Or(tempLamda, lamda);
}
break;
case "&&":
default:
{
lamda = Expression.And(tempLamda, lamda);
}
break;
}
tempLamda = lamda;
}
}
}
}
#endregion
return Context.Set<TEntity>().Where(Expression.Lambda<Func<TEntity, bool>>(lamda, parameter)).ToList();
}
上面还有一些运算时没有的,比如in not in 等 这些你可以试着自己去写,没有问题的,我这边只是做一个例子,希望你有更好的思路,多多交流才是王道,做IT的,不能闭关自守,好了,写到这里那么我们就完成了 select * from 表名 where 列1=‘XX’ and 列2=‘XX’ 这种形式的查询,当然或也是可以的 select * from 表名 where 列1=‘XX’ or 列2=‘XX’ 上面写了这么多,那么前段的值怎么传过来呢?虽然在第一篇文章中有提到过,我这里也在啰嗦一下好了,看家伙:
{ Join: "||", Property: "merchant_accno", Operator: "like", Value:v }
这个时候,我们只需要在后端定义一个类来接受这种形式的传参就行了,同样,上代码,程序员少说话:
public class ConditionLamda
{
public string Join { get; set; }
public string Property { get; set; }
public string Operator { get; set; }
public string Value { get; set; }
}
好的,这么一来我们就搞定了通用查询了,但是你可能会问,那么如何搞定 select * from 表名 where 列1=‘’ and (列2 like ‘XX’ or 列3 like '%XX%') 这种组合查询呢个,我们下回分享,喜欢的可以
码农 https://shop162421329.taobao.com