在我看来,有一个数据表包含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个条件,并且设置了这两个条件。
答案 0 :(得分:1)
您可以使用延迟评估来解决此问题 -
String.IsNullOrEmpty(ci.OS) OrElse ci.OS.ToUpper.Equals(_selectedOS.ToUpper)
这样,如果字符串为null或为空,则不评估第二个子句并接受所有ServerRows。
另外不要忘记AndAlso的优先级高于OrElse,所以每个子句都必须用括号括起来。