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.已删除