使用Linq基于组合框选择过滤集合

时间:2014-03-22 14:08:53

标签: wpf linq mvvm

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

 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.如果用户选择不按标志过滤,那么他在该组合框中选择选项All如何将其应用于上述linq查询

2.一般情况下,如果用户想要通过组合框中的值来过滤,该组合框中没有数据库中的对等方法(如1中的所有选项或选项的反转)

注意:我试图添加语句[_subsystemRptPanelViewModel.SelectedMS!=&#34; All&#34;]以排除实现过滤器,如果用户选择了所有选择但是在一个组合框中选择All选项时,结果是一个空的查询结果。

1 个答案:

答案 0 :(得分:1)

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

您希望返回值与用户选择的值或用户选择的值匹配的值&#39;全部&#39; values:第一个示例遵循上面查询的模式,只返回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

编辑:

混合&#34;不&#39;在此查询中,您必须将等于比较的结果与值&#39; Is&#39;进行比较。或&#34;不是&#39;用户指定的那个

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

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

// etc