我正在尝试过滤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的代理?
答案 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
类似。在我看来,这里更具可读性。