LINQ使用OR检查空值

时间:2018-03-08 08:32:20

标签: performance linq logic

表User中有2个值:Address1,Address2。两者都可以为空。作为过滤方法的一部分,我正在尝试类似下面的内容:

var tempUsers = users.Where(q => q.Address1.ToLower().Contains(address.ToLower()) || q.Address2.ToLower().Contains(address.ToLower())); 

这会返回Null引用异常,这是正确的。

  1. Linq查询需要针对空值进行处理
  2. 我会尝试 查询中的null.ToLower()和null.Contains()
  3. 最好的解决方法是什么?如果它是一个简单的1字段查询,例如只是Address1,我会简单地过滤掉所有空的Address1项目,并在第二个查询中继续正常。在这种情况下,两个字段对过滤都很重要,因为输入:地址可以在User表的Address1 Address2中。

    我知道这可能不是1班轮,但在时间和性能方面最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

这个怎么样:

var address = (GetAddressFromOuterWorld() ?? String.Empty).ToLower();
var tempUsers = users.Where(user => (user.Address1 ?? String.Empty).ToLower().Contains(address) 
                                 || (user.Address2 ?? String.Empty).ToLower().Contains(address));

这肯定适用于LINQ to Object,但可能因LINQ to SQL而失败,但在这种情况下,您通常会编写user.Address1 == address || user.Addrss2 == address并且您的数据库使用case-insensitive collate setting

答案 1 :(得分:0)

您可以轻松添加这样的空检查。

var tempUsers = users.Where(q =>
(!string.IsNullOrEmpty(q.Address1) && q.Address1.ToLower().Contains(address.ToLower())) ||
(!string.IsNullOrEmpty(q.Address2) && q.Address2.ToLower().Contains(address.ToLower())));