【问题标题】:How to use Contains() function if field value is null in linq如果 linq 中的字段值为空,如何使用 Contains() 函数
【发布时间】:2017-01-06 11:34:16
【问题描述】:

我正在做一个项目,我使用Linq 来获取数据。现在我有一个场景,我必须检查字段值是否包含我使用Contains() 函数的给定字符串。

一切正常,但是当任何字段为null 时,就会产生问题。

personData = personData.Where(x => x.FirstName.ToLower().Contains(q.ToLower()) || x.LastName.ToLower().Contains(q.ToLower())).Select(x => x).ToList();

在这里,当 FirstName 或 LastName 字段具有空值时,它会引发错误。

那么,我该如何克服这个问题呢?

【问题讨论】:

  • 添加一个子句检查x.FirstName是否为空..?
  • 你用的是什么版本的c#?如果 c#6 那么空条件是一个选项。
  • 我正在使用 C# 4.5 @Nkosi
  • 如果 q 为空怎么办?你是怎么处理的?
  • @stomy, q 是函数的参数,所以我们可以先检查 if(string.IsNullOrEmpty(q)) {}

标签: c# linq


【解决方案1】:

请试试这个

personData = personData.Where(x => (x.FirstName != null && x.FirstName.ToLower().Contains(q.ToLower())) ||  (x.LastName != null && x.LastName.ToLower().Contains(q.ToLower()))).Select(x => x).ToList();

【讨论】:

  • 很高兴为您提供帮助。 :)
  • 使用命名方法而不是长 lambda。 private static bool Filter(string input, string search) {....} 然后在 Where 中使用。 personData.Where(x => Filter(x, q))@Jigarb1992
  • 请回复@M.kazemAkhgary
【解决方案2】:

您必须先检查所需的值是否为null,尝试使用null-coalescing operator...

personData = personData.Where(x => ((x.FirstName.ToLower() ?? "").Contains(q.ToLower())) ||  ((x.LastName.ToLower() ?? "").Contains(q.ToLower()))).Select(x => x).ToList();

【讨论】:

  • 它抛出错误“运算符'&&'不能应用于'string'和'bool'类型的操作数”@RahulHendawe
  • 太棒了!这是处理这种情况的更好方法,如果您获得任何 null 值,那么这些值将被替换为 _blank 值:)
【解决方案3】:

使用以下方法:x.FirstName?.Contains(substring) ?? false

从 C# 6 开始,您可以使用空条件运算符,这大大简化了一些查询。您可以阅读有关此主题的更多信息here

【讨论】:

    【解决方案4】:

    如何使用如下的简单字符串扩展:

    public static string AsNotNull(this string value)
    {
        if (string.IsNullOrWhiteSpace(value))
            return string.Empty;
    
        return value;
    }
    

    然后像这样使用它:

    x.FirstName.AsNotNull()
    

    【讨论】:

    • 同样,为了避免 null 当您期望列表时,您可以从 this 答案添加第二个扩展作为重载。然后,以相同的方式使用它,即.Select(x => x).AsNotNull().ToList();。使用这两种扩展,一种用于字符串,一种用于可枚举,您已经装备精良!
    【解决方案5】:

    我认为您应该阻止在开头添加 null FirstName 或 LastName 的能力。这种行好像没什么用。

    【讨论】:

    • 这是个好建议。因为如果 FirstName 和 LastName 都可以为空,那么命名的意义何在?如果 FirstName 或 LastName 必须为空,我建议使用 "" 而不是 null
    • 我在问题中写的代码只是例如实际上可能有任何字段。
    猜你喜欢
    • 1970-01-01
    • 2020-11-04
    • 2011-08-07
    • 1970-01-01
    • 2010-09-16
    • 2017-10-07
    • 1970-01-01
    • 2020-04-10
    • 2023-04-10
    相关资源
    最近更新 更多