1

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

现在问题来了:如果我有 4 个标准,这意味着我有 4 个不同场景的 2 次方。我想做的是编写一个处理所有这些场景的 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 个条件一起工作,并且设置了这两个条件。

4

1 回答 1

1

您可以使用惰性评估来解决此问题 -

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

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

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

于 2012-06-07T17:23:02.270 回答