LINQ查询的where子句中的“ OR”条件返回null

时间:2019-12-12 10:15:32

标签: c# .net linq

以下代码在单独执行时可以正确执行,但包含或条件时  在单个查询中将两个条件合并在一起,其返回null

userSessionList = userSessionList.Where(u => 
            (u.User.FirstName.ToLower().Contains(name)) || 
            (u.User.LastName.ToLower().Contains(name))
        )
        .ToList();

3 个答案:

答案 0 :(得分:1)

尝试一下,看看是否有效:

   userSessionList = userSessionList.Where(u => 
        (u.User != null && u.User.FirstName != null && u.User.FirstName.ToLower().Contains(name)) || 
        (u.User != null && u.User.LastName != null && u.User.LastName.ToLower().Contains(name))
    )
    .ToList();

您还可以在同一执行中运行以下命令进行测试,以查看结果

    var userSessionList1 = userSessionList.Where(u => 
        (u.User.FirstName.ToLower().Contains(name))
    )
    .ToList();

    var userSessionList2 = userSessionList.Where(u => 
        (u.User.FirstName.ToLower().Contains(name))
    )
    .ToList();

    var userSessionListBoth = userSessionList.Where(u => 
        (u.User.FirstName.ToLower().Contains(name)) || 
        (u.User.LastName.ToLower().Contains(name))
    )
    .ToList();

并检查三个不同的列表。我认为,因为您要覆盖现有列表,所以可能是您在上一个查询中再次做了,这就是为什么您遇到这种奇怪的情况。

答案 1 :(得分:1)

使用Null-conditional operators

userSessionList = userSessionList.Where(u => 
            (u.User?.FirstName?.ToLower().Contains(name) == true) || 
            (u.User?.LastName?.ToLower().Contains(name) == true)
        )
        .ToList();

答案 2 :(得分:-1)

您可以使用String.IndexOf Method并通过StringComparison.OrdinalIgnoreCase作为要使用的搜索类型:

culture.CompareInfo.IndexOf(u.User.LastName, name, CompareOptions.IgnoreCase) >= 0