一般前端传过来的条件都要判断一下某个字段是否有值,如果有值则拼接查询条件,否则就忽略
最简单的方法就是用三元简化一下
也可以做个简单的封装
public static IQueryable<T> Where<T>(this IQueryable<T> query, bool flag, Expression<Func<T, bool>> expression)
{
return flag ? query.Where(expression) : query;
}
public static IQueryable<T> Where<T>(this IQueryable<T> query, string flag, Expression<Func<T, bool>> expression)
{
return !string.IsNullOrEmpty(flag) ? query.Where(expression) : query;
}
然后用的时候
Test input = new Test
{
Id = null,
Name = "233",
Num = 233
};
List<Test> list = new()
{
new Test { Id = Guid.NewGuid(), Name = "2" },
new Test { Id = Guid.NewGuid(), Name = "233333" },
new Test { Id = Guid.NewGuid(), Name = "233333", Num = 233333 },
new Test { Id = Guid.NewGuid(), Name = "233333", Num = 3 },
new Test { Id = Guid.NewGuid(), Name = "23" },
new Test { Id = Guid.NewGuid(), Name = "23", Num = 2333 },
};
// 具体用的时候大概就这样
var result = list.AsQueryable()
.Where(input.Id.HasValue, item => item.Id == input.Id)
.Where(input.Name, item => item.Name.Contains(input.Name))
.Where(input.Num > 0, item => item.Num > input.Num * 20).ToList();
大概是可以用的
应该可以通过封装一个泛型方法,去遍历查询参数,然后返回对应的查询表达式,不过这种方式还是有局限性的,不一定适用于所有情况,而且还得根据不同类型做处理,不一定很简单。不过如果你们这种if判断很多,那可以这样子写。
封装呗,不然还咋办
前端用post 提交,除了传参数值,还要传该值的查询操作。后端用 form 接收,根据form里面的参数组装
例如
dName: 测试设备
dName_oper: like
DeptIDs: 3
后端经过处理后就是:dName like '%测试设备%' and DeptID in (3)
Lambda 动态组装表达式树也能实现类似效果,网上有很多例子
移步了解OData,这种东西交给机器和模块就好了。只需要IQueryable.Limit().OData(),业务在Limit控制限制就好了。
通过对类的反射来判断,这样就写一次if,我把类转成sql语句的时候就是这样弄得