【问题标题】:Filtering a Collection using Linq based on Combo boxes Selections基于组合框选择使用 Linq 过滤集合
【发布时间】:2014-03-22 14:08:52
【问题描述】:

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

 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.SelectedMS != "All"] 如果用户选择了所有选择但在一个组合框中选择 All 选项时,结果是一个空查询,以排除实现过滤器结果。

【问题讨论】:

  • 我不确定您的第二个问题是什么意思 - 如果用户搜索不在数据库中的值,那么将返回哪些结果?
  • @stuartd 抱歉不够清楚,我的意思是,例如,如果您的婚姻状态字段包含以下选项:单身、已婚、离婚,您可以通过数据库中存在的这些选项之一进行过滤,或者您可能根本不想按此字段进行过滤,因此您选择组合框中存在的所有选项,但它不是数据库中的选择,或者您可能希望按(未离婚)人员进行过滤,这也可能是一个选项在组合框中,但不是数据库中的选择

标签: wpf linq mvvm


【解决方案1】:

例如,如果用户选择不按 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

【讨论】:

  • 谢谢它工作正常。只是我在问题的 cmets 中添加的一个问题:根据该评论,如果我想选择除 Divorced 之外的所有选项,如何将此类选项连接到 linq 查询中。
  • 再次感谢,我应用了您在答案的编辑部分中提出的建议,效果非常好。
猜你喜欢
  • 2021-07-11
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多