首页 新闻 会员 周边 捐助

写查询的时候有没有办法干掉这些烦人的if判断

0
悬赏园豆:20 [已解决问题] 解决于 2021-03-03 10:26

问题补充:

一般前端传过来的条件都要判断一下某个字段是否有值,如果有值则拼接查询条件,否则就忽略

无敌土豆的主页 无敌土豆 | 初学一级 | 园豆:80
提问于:2020-12-25 11:25
< >
分享
最佳答案
0

最简单的方法就是用三元简化一下

也可以做个简单的封装

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();

大概是可以用的

收获园豆:20
崩坏的领航员 | 菜鸟二级 |园豆:438 | 2020-12-25 14:37
其他回答(5)
0

应该可以通过封装一个泛型方法,去遍历查询参数,然后返回对应的查询表达式,不过这种方式还是有局限性的,不一定适用于所有情况,而且还得根据不同类型做处理,不一定很简单。不过如果你们这种if判断很多,那可以这样子写。

浅草青晨 | 园豆:904 (小虾三级) | 2020-12-25 14:01
0

封装呗,不然还咋办

yytxdy | 园豆:1680 (小虾三级) | 2020-12-25 17:32
0

前端用post 提交,除了传参数值,还要传该值的查询操作。后端用 form 接收,根据form里面的参数组装
例如
dName: 测试设备
dName_oper: like
DeptIDs: 3
后端经过处理后就是:dName like '%测试设备%' and DeptID in (3)
Lambda 动态组装表达式树也能实现类似效果,网上有很多例子

geass.. | 园豆:1821 (小虾三级) | 2020-12-26 11:02
0

移步了解OData,这种东西交给机器和模块就好了。只需要IQueryable.Limit().OData(),业务在Limit控制限制就好了。

花飘水流兮 | 园豆:13617 (专家六级) | 2020-12-27 14:32
0

通过对类的反射来判断,这样就写一次if,我把类转成sql语句的时候就是这样弄得

jqw2009 | 园豆:2341 (老鸟四级) | 2020-12-28 09:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册