Wpf 基于组合框选择使用Linq筛选集合

Wpf 基于组合框选择使用Linq筛选集合,wpf,linq,mvvm,Wpf,Linq,Mvvm,我使用以下代码根据通过组合框捕获并发送到视图模型或控制器的用户选项过滤集合,以实现级联过滤: IEnumerable<SubsystemDTO> _ssDTOs = _subsystemService .GetAllSubsystemsList() .Where(s => s.MS != null && s.MS.Equals(_subsystemRptPanelViewModel.Sele

我使用以下代码根据通过组合框捕获并发送到视图模型或控制器的用户选项过滤集合,以实现级联过滤:

 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");
IEnumerable\u ssDTOs=\u子系统服务
.GetAllSubsystemsList()
。其中(s=>s.MS!=null
&&s.MS.Equals(_subsystemRptPanelViewModel.SelectedMS)
&&_subsystemRptPanelViewModel.SelectedMS!=“全部”)
.其中(s=>s.标志!=null
&&s.Flag.Equals(_subsystemRptPanelViewModel.SelectedFlag)
&&_subsystemRptPanelViewModel.SelectedFlag!=“全部”)
.Where(s=>s.Scope!=null
&&s.Scope.Equals(_subsystemrptppanelviewmodel.SelectedScope)
&&_subsystemrptppanelviewmodel.SelectedScope!=“全部”);
我有3个组合框,用于收集用户选项,它们以级联方式应用于集合,如图所示。数据从数据库中获取,该数据库包含与组合框传递的值相等的值。我的问题是:

1.例如,如果用户选择不按标志过滤,那么他会在组合框中选择选项All,如何将其应用于上述linq查询

2.通常情况下,如果用户希望通过组合框中的一个值进行筛选,而该值在数据库中没有对等项,则如何进行筛选(如1中的所有选项或选项的反转)

注意:我试图添加语句[\u subsystemRptPanelViewModel.SelectedMS!=“All”]以排除在用户选择所有选项时实现过滤器,但在一个组合框中选择所有选项时,结果是空查询结果。

例如,如果用户选择不按标志过滤,因此,他选择了组合框中的选项All,即如何将其应用于上面的linq查询

您希望返回值与用户选择的值或用户选择的“全部”值匹配的值:第一个示例遵循上述查询的模式,仅返回
子系统DTO
值(MS、Flag、Scope)不为空的值

  .Where(s => s.MS != null 
     && (_subsystemRptPanelViewModel.SelectedMS == "All" 
     || s.MS.Equals(_subsystemRptPanelViewModel.SelectedMS)))

  // etc
如果希望返回所有值,而不管是否填充了
子系统dto
属性,则应将“全部”复选框移到顶部:

  .Where(s => _subsystemRptPanelViewModel.SelectedMS == "All"
     || (s.MS != null && s.MS.Equals(_subsystemRptPanelViewModel.SelectedMS)))

  // etc
编辑:

要将“Not”混入该查询,您必须将Equals比较的结果与用户指定的值“Is”或“Not”进行比较

如果您有一个名为
IsMatch
的视图模型属性,当用户希望匹配选定值时,该属性为
true
,当值与选定值不匹配时,该属性为
false

 .Where(s => _subsystemRptPanelViewModel.SelectedMS == "All"
    || (s.MS != null && s.MS.Equals(_subsystemRptPanelViewModel.SelectedMS)
                            .Equals(_subsystemRptPanelViewModel.IsMatch))

// etc

我不知道你的第二个问题是什么意思-如果用户搜索的值不在数据库中,那么会返回哪个结果?@stuartd很抱歉不够清楚,我的意思是,例如,如果你有婚姻状况字段,其中包含选项:单身、已婚、,您可以按数据库中存在的其中一个选项进行筛选,或者您可能根本不想按此字段进行筛选,因此您可以选择组合框中存在的所有选项,但该选项不是数据库中的选项,或者您可能希望按(非离异)进行筛选人员也可能是组合框中的一个选项,但不是数据库中的一个选择。谢谢,它工作正常。我在问题的评论中添加了一个问题:根据该评论,如果我想选择所有选项,那么如何将该选项连接到linq查询中。再次感谢,我在您的答案的编辑部分应用了您的建议,它工作得非常好。