如何在不使用if语句时,当变量为特定值忽略LINQ查询片段?
问题
现有一段LINQ查询代码:
var longlinq = viewModel.Where(x => (x.Systems.Storage == SelectOption || x.Systems.Laptop == SelectOption || x.Systems._2In1 == SelectOption || x.Systems.Convertible == SelectOption ) || (x.Component.Components == SelectOptionComp || x.Component.Boards == SelectOptionComp) || ( x.Service.Services == SelectOptionSer || x.Service.DevelopmentTools_andServices == SelectOptionSer ) || (x.Software.Softwares == SelectOptionSoft || x.Software.Analytics == SelectOptionSoft) || (x.Application.Applications == SelectOptionApp || x.Application.PrintImaging_andOfficeAutomation ));
需求是:当SelectOptionComp等于"-"时,忽略查询中用到该参数的条件组,且不想因为参数组合多而写大量if语句,该怎么实现?
解决方法
给每个条件组加个前置判断:如果对应的筛选参数是"-",就让这个条件组直接返回true(相当于跳过该组筛选),否则执行原匹配逻辑。
修改后的代码:
var longlinq = viewModel.Where(x => // 系统组:参数为"-"则跳过,否则匹配字段 (SelectOption == "-" || x.Systems.Storage == SelectOption || x.Systems.Laptop == SelectOption || x.Systems._2In1 == SelectOption || x.Systems.Convertible == SelectOption) || // 组件组:参数为"-"时直接跳过该组 (SelectOptionComp == "-" || x.Component.Components == SelectOptionComp || x.Component.Boards == SelectOptionComp) || // 服务组:同理 (SelectOptionSer == "-" || x.Service.Services == SelectOptionSer || x.Service.DevelopmentTools_andServices == SelectOptionSer) || // 软件组:同理 (SelectOptionSoft == "-" || x.Software.Softwares == SelectOptionSoft || x.Software.Analytics == SelectOptionSoft) || // 应用组:原代码这里疑似漏了参数匹配,我补成和SelectOptionApp对比,可按需调整 (SelectOptionApp == "-" || x.Application.Applications == SelectOptionApp || x.Application.PrintImaging_andOfficeAutomation == SelectOptionApp) );
逻辑解释
- 每个条件组开头的
参数 == "-"是核心:只要参数是"-",整个组的结果就是true,不会走后面的字段匹配,相当于直接跳过该部分的筛选。 - 当参数不是"-"时,就会执行原本的字段匹配逻辑,和原查询行为完全一致。
- 这种方式不用拆分多个if分支拼接查询,所有逻辑都集中在一个Where表达式里,简洁易维护。
内容的提问来源于stack exchange,提问作者E__
相关产品推荐
相关产品推荐

