假设你有一个IEnumerable<User>
,你可以这样做:
// Query for "Tom" being contained in any of the fields.
var query =
from user in users
where
(user.SamAccountName != null && user.SamAccountName.Contains("Tom")) ||
(user.EmailAddress != null && user.EmailAddress.Contains("Tom")) ||
(user.WorkPhone != null && user.WorkPhone.Contains("Tom")) ||
(user.MobilePhone != null && user.MobilePhone.Contains("Tom")) ||
(user.Office != null && user.Office.Contains("Tom"))
select user;
null
请注意,如果这些字段中的任何一个为空,则检查很重要,否则,当您在类上调用该Contains
方法时,它将抛出 a ,因为没有字符串可以调用on。String
NullReferenceException
Contains
该where
子句只是映射到类上的Where
扩展方法(确保有一个声明,以便编译器识别扩展方法)。Enumerable
using System.Linq;
如果您觉得 null 检查过多和/或重复,您可以像这样缩减代码:
// Generate your predicate.
Func<string, bool> checkContainsTom = s => s != null && s.Contains("Tom");
// Query.
var query =
from user in users
where
checkContainsTom(user.SamAccountName) ||
checkContainsTom(user.EmailAddress) ||
checkContainsTom(user.WorkPhone) ||
checkContainsTom(user.MobilePhone) ||
checkContainsTom(user.Office)
select user;
这稍微好一些,因为您正在封装冗余逻辑;如果逻辑发生变化,您只需在一处进行更改,它将应用于所有检查。如果需要,请随意用函数替换lambda 表达式。
如果要使用延迟执行query
,则可以使用 a进行枚举。如果您需要在具体化列表中使用它(例如 a ),那么您只需调用类的扩展方法,如下所示:foreach
List<User>
ToList
Enumerable
IList<User> materializedResults = query.ToList();