C# 带多个条件的Where子句
我想写一些类似以下的东西:-C# 带多个条件的Where子句,c#,linq,C#,Linq,我想写一些类似以下的东西:- Technologies.Where(a2 => a2.IsDeleted.Equals(false) && (a => a.Tag.ToUpper().StartsWith(q.ToUpper()) || (q == null))) 1. Isdeleted = false 2. startwith q 3. OR q ==null 其思想
Technologies.Where(a2 => a2.IsDeleted.Equals(false)
&& (a => a.Tag.ToUpper().StartsWith(q.ToUpper())
|| (q == null)))
1. Isdeleted = false
2. startwith q
3. OR q ==null
其思想是检索具有以下内容的所有技术对象:-
Technologies.Where(a2 => a2.IsDeleted.Equals(false)
&& (a => a.Tag.ToUpper().StartsWith(q.ToUpper())
|| (q == null)))
1. Isdeleted = false
2. startwith q
3. OR q ==null
您的答案几乎是正确的,您不必为第二个标准重新定义
a2
var
Technologies.Where(a2 => !a2.IsDeleted
&& (q == null)
|| a2.Tag.ToUpper().StartsWith(q.ToUpper()))
他们都在同一张桌子上吗?那问题是什么?语法在我看来很好,但当条件太多时,很快就会变得难以阅读。这些条件是如何分组的
(1和2)| 3
或1和(2 | 3)
?您应该只将忽略大小写字符串比较器指定为StartsWith
,而不是对两个字符串都调用ToUpper
。它的性能更高,可以更好地处理非英语字符串,正确地传达预期的语义,并更好地处理空值。请注意,需要颠倒q==null
和q.ToUpper()
检查的顺序(与之前的检查相同)。如前所述,每当q为null时,您将得到一个null ref异常。同意将q==null
放在前面,我们不需要Equals(false)
,只需将其设置为!a2.已删除
。