使用动态查询过滤列表?

时间:2017-12-06 15:14:12

标签: .net vb.net linq filter

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

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 likeo:

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

但由于我的查询是动态的,取决于在用户表单上检查了哪些国家/地区,如果有50个国家/地区要包含在我的搜索结果中,我该怎么办?我已经阅读了有关PredicateBuilder的内容,但我还没有找到包含逻辑OR的示例,比如我是按Status属性过滤并且我想要包含Status = Valid OR Status = Unknown的代理?

1 个答案:

答案 0 :(得分:3)

您可以使用集合和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,这与在第一个OrElse中使用Where类似。在我看来,这里更具可读性。