我使用以下代码根据用户选项过滤集合,这些选项通过组合框捕获并发送给视图模型或控制器以实现级联过滤:
IEnumerable<SubsystemDTO> _ssDTOs = _subsystemService
.GetAllSubsystemsList()
.Where(s => s.MS != null
&& s.MS.Equals(_subsystemRptPanelViewModel.SelectedMS)
&& _subsystemRptPanelViewModel.SelectedMS != "All")
.Where(s => s.Flag != null
&& s.Flag.Equals(_subsystemRptPanelViewModel.SelectedFlag)
&& _subsystemRptPanelViewModel.SelectedFlag != "All")
.Where(s => s.Scope != null
&& s.Scope.Equals(_subsystemRptPanelViewModel.SelectedScope)
&& _subsystemRptPanelViewModel.SelectedScope != "All");
我有3个组合框收集用户选项,它们以级联方式应用于集合,如图所示。数据是从数据库中获取的,其中包含与组合框传递的值相等的值,我的问题是:
1。例如,如果用户选择不按Flag进行过滤,那么他在组合框中选择了All选项如何将其应用于上面的linq查询
2。一般来说,如果用户想通过组合框中的值进行过滤而该值在数据库中没有对应值该怎么做(比如1中的所有选项或一个选项的反转)
注意:我试图添加语句[_subsystemRptPanelViewModel。
如果用户选择不按Flag进行过滤,那么他在该组合框中选择了选项All,如何将其应用于上述linq查询
您希望返回的值与用户选择的值或用户选择的"所有"值相匹配:第一个示例遵循上面的查询模式,并且仅返回SubsystemDTO
值(MS, Flag, Scope)不为空的值。
.Where(s => s.MS != null
&& (_subsystemRptPanelViewModel.SelectedMS == "All"
|| s.MS.Equals(_subsystemRptPanelViewModel.SelectedMS)))
// etc
如果您想返回所有值,而不管SubsystemDTO
属性是否填充,您可以将all检查移到顶部:
.Where(s => _subsystemRptPanelViewModel.SelectedMS == "All"
|| (s.MS != null && s.MS.Equals(_subsystemRptPanelViewModel.SelectedMS)))
// etc
编辑:要将"Not "混合到这个查询中,您必须将Equals比较的结果与值"Is "或"Is Not "是否为用户指定的值
如果你有一个名为IsMatch
的视图模型属性,当用户想要匹配所选值时,它是true
,当值不匹配所选值时,它是false
:
.Where(s => _subsystemRptPanelViewModel.SelectedMS == "All"
|| (s.MS != null && s.MS.Equals(_subsystemRptPanelViewModel.SelectedMS)
.Equals(_subsystemRptPanelViewModel.IsMatch))
// etc