Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 使用或检查空值的LINQ_Performance_Linq_Logic - Fatal编程技术网

Performance 使用或检查空值的LINQ

Performance 使用或检查空值的LINQ,performance,linq,logic,Performance,Linq,Logic,我在表User中有2个值:Address1,Address2。两者都可以为空。作为筛选方法的一部分,我尝试以下方法: var tempUsers = users.Where(q => q.Address1.ToLower().Contains(address.ToLower()) || q.Address2.ToLower().Contains(address.ToLower())); 这将返回一个空引用异常,这是正确的 Linq查询需要针对空值进行处理 我会尝试 查询中的null.T

我在表User中有2个值:Address1,Address2。两者都可以为空。作为筛选方法的一部分,我尝试以下方法:

var tempUsers = users.Where(q => q.Address1.ToLower().Contains(address.ToLower()) || q.Address2.ToLower().Contains(address.ToLower())); 
这将返回一个空引用异常,这是正确的

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

    我知道这在1班机中可能不可能实现,但就时间和性能而言,最好的方法是什么

    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对象,但可能不适用于LINQ to SQL,但在这种情况下,您通常会编写
    user.Address1==address | | user.Addrss2==address
    ,并且您的数据库使用了。

    这是怎么回事:

    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对象,但可能无法使用LINQ to SQL,但在这种情况下,您通常会编写
    user.Address1==address | | | user.Addrss2==address
    ,并且您的数据库使用。

    您可以像这样轻松地添加空检查

    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())));
    

    您可以像这样轻松地添加空检查

    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())));
    

    试试这个:var tempUsers=users.Where(q=>(q.Address1!=null&&q.Address1.ToLower().Contains(address.ToLower())| |(q.Address2!=null&&q.Address2.ToLower().Contains(address.ToLower());试试这个:var tempUsers=users.Where(q=>(q.Address1!=null&&q.Address1.ToLower().Contains(address.ToLower())| |(q.Address2!=null&&q.Address2.ToLower().Contains(address.ToLower());