表User中有2个值:Address1,Address2。两者都可以为空。作为过滤方法的一部分,我正在尝试类似下面的内容:
var tempUsers = users.Where(q => q.Address1.ToLower().Contains(address.ToLower()) || q.Address2.ToLower().Contains(address.ToLower()));
这会返回Null引用异常,这是正确的。
最好的解决方法是什么?如果它是一个简单的1字段查询,例如只是Address1,我会简单地过滤掉所有空的Address1项目,并在第二个查询中继续正常。在这种情况下,两个字段对过滤都很重要,因为输入:地址可以在User表的Address1 或 Address2中。
我知道这可能不是1班轮,但在时间和性能方面最好的方法是什么?
答案 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())));