使用Linq和多个条件过滤集合

时间:2012-06-07 17:06:18

标签: vb.net linq

在我看来,有一个数据表包含ServerRow和4个文本框(主机名,操作系统,位置,区域)的集合。当用户输入4个框中的任何一个时,我想立即过滤此列表。我有这个代码设置,并准备在我调用过滤器方法的每个文本框属性的set方法上。

现在解决问题:如果我有4个标准,那意味着我有4个不同场景的力量。我想做的是写一个linq语句,处理所有这些场景,如果任何属性是NullOrEmpty,它们将不会在Where子句和翻转方面使用有一个值,将使用Contains搜索相应的字段。

实施例

AvailableCis = New ObservableCollection(Of ServerRow)
                (_CiData.Where(Function(ci) ci.OS.ToUpper
                .Equals(_selectedOS.ToUpper) AndAlso 
                ci.HostName.ToUpper.Contains(_ciNameFilterText.ToUpper))
                .OrderBy(Function(a) a.CiName))

此示例显示了它如何使用2个条件,并且设置了这两个条件。

1 个答案:

答案 0 :(得分:1)

您可以使用延迟评估来解决此问题 -

String.IsNullOrEmpty(ci.OS) OrElse ci.OS.ToUpper.Equals(_selectedOS.ToUpper)

这样,如果字符串为null或为空,则不评估第二个子句并接受所有ServerRows。

另外不要忘记AndAlso的优先级高于OrElse,所以每个子句都必须用括号括起来。