【问题标题】:Filter list using dynamic query?使用动态查询过滤列表?
【发布时间】:2017-12-06 15:14:12
【问题描述】:

我正在尝试过滤代理类型的对象列表。这是它的属性。

Public Property IP As String
Public Property Port As Integer
Public Property Status As ProxyStatus
Public Property Country As String
Public Property Speed As Integer

在过滤器表单上,我有一个带有国家/地区名称的 CheckListBox,如果选中了一个国家/地区,它应该包含在过滤结果中。

我知道我可以像这样使用硬编码的 LINQ:

Dim result = proxies.Where(Function(p) p.Country = "USA" OR p.Country = 
     "Russia")

但由于我的查询是动态的,具体取决于在用户表单上检查的国家/地区,当我想在结果中包含 50 个国家/地区时,我该如何处理?我已经阅读过有关 PredicateBuilder 的信息,但我没有找到包含逻辑 OR 的示例,例如,如果我通过 Status 属性进行过滤并且我想包含 Status = Valid OR Status = Unknown 的代理?

【问题讨论】:

    标签: .net vb.net linq filter


    【解决方案1】:

    您可以使用集合和Contains

    Dim countries As String() = SelectedCountries
    Dim result = proxies.Where(Function(p) countries.Contains(p.Country))
    

    我使用了SelectedCountries,因为我不知道用户如何选择国家。但我确定您知道创建该数组(或列表)。

    此外:

    我需要动态 OR 语句,例如 Status = Valid OR Status = 未知。这取决于用户选择的各种 复选框

    Dim allowedStatuses = SelectedStatuses
    result = result.Where(Function(p) allowedStatuses.Contains(p.Status))
    

    您注意到我使用的是result = result.Where 而不是proxies.Where。您可以连接多个Where,这类似于在第一个Where 中使用OrElse。在我看来,这在这里更具可读性。

    【讨论】:

    • 嗨,谢谢蒂姆。这肯定解决了我的部分问题,谢谢。在我需要动态 OR 语句的情况下,例如 Status = Valid OR Status = Unknown。这取决于用户对过滤表单上各种复选框的选择。如果你能帮助我解决我问题的最后一部分,我一定会把它标记为答案。
    • @DavidStampher:看看
    • @TimSchemlter 正是我要找的东西。万分感谢。 (27 秒,我可以标记为答案...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2019-08-08
    • 2017-06-29
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    相关资源
    最近更新 更多