【问题标题】:LINQ Filter values on list values using contain使用包含的列表值上的 LINQ 过滤值
【发布时间】:2021-03-22 12:55:43
【问题描述】:

我知道有几个关于这个问题的 SO 帖子,我在提出当前解决方案时使用了它们。

查看下面的 4 行代码,前三行不起作用,但第四行是(!?),我不明白为什么会这样。前两个只检查一个字符串:“Where values that contains 'string'”,后两个检查一个字符串列表“Where values that contains any strings in this list”

contactsDynamicResponses.Values.Where(cdr => cdr.Firstname.Contains(firstName)).ToList();
contactsDynamicResponses.Values.Where(cdr => cdr.Lastname.Contains(lastName)).ToList();

contactsDynamicResponses.Values.Where(cdr => accountIdsList.Any(ail => cdr.AccountId.Contains(ail))).ToList();
contactsDynamicResponses.Values.Where(cdr => contactIdsList.Any(cil => cdr.ContactId.Contains(cil))).ToList();

我的目标是根据输入到函数中的搜索过滤器过滤列表。下面是我得到的错误,这让我觉得contactsDynamicResponses.Values 有问题,这就是这里的问题,但我迷路了。

System.NullReferenceException: '对象引用未设置为对象的实例。' Project.Entities.Contact.Models.Dynamics.ContactDynamicsResponse.Firstname.get 返回 null。

行的完整外观:

contactsDynamicResponses.Values = string.IsNullOrEmpty(firstName) ? contactsDynamicResponses.Values : contactsDynamicResponses.Values.Where(cdr => cdr.Firstname.Contains(firstName)).ToList();
contactsDynamicResponses.Values = string.IsNullOrEmpty(lastName) ? contactsDynamicResponses.Values : contactsDynamicResponses.Values.Where(cdr => cdr.Lastname.Contains(lastName)).ToList();
           
contactsDynamicResponses.Values = accountIdsList == null ? contactsDynamicResponses.Values : contactsDynamicResponses.Values.Where(cdr => accountIdsList.Any(ail => cdr.AccountId.Contains(ail))).ToList();
contactsDynamicResponses.Values = contactIdsList == null ? contactsDynamicResponses.Values : contactsDynamicResponses.Values.Where(cdr => contactIdsList.Any(cil => cdr.ContactId.Contains(cil))).ToList();

欢迎任何想法!谢谢!

【问题讨论】:

  • 看来你应该在ContainsFirstNameLastName 上调用Contains 之前添加空检查,因为这些属性可能会为空并在此处导致您的异常
  • 异常已经告诉你问题出在哪里:ContactDynamicsResponse.Firstname.get returned null.。所以 Firstname 是 null 并且你在一个为 null 的字符串上调用 .Contains() 所以你得到一个 NullReferenceException

标签: c# linq lambda


【解决方案1】:

在查询中添加空检查:

contactsDynamicResponses.Values.Where(cdr => cdr.Firstname != null && 
    cdr.Firstname.Contains(firstName)).ToList();

异常表明FirstName 为空。
还要在其他查询中添加此检查,例如LastName

【讨论】:

  • 啊,当然!我没有想到 cdr.FirstName 可以为空(即使它已被拼写出来)。谢谢你让我开心:)
【解决方案2】:

进行空值检查的更短方法:

contactsDynamicResponses.Values.Where(cdr =>
    cdr.Firstname?.Contains(firstName) == true
).ToList();

== true 看起来有点奇怪,但这是因为比较的结果是bool?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 2021-11-06
    • 2017-12-17
    • 1970-01-01
    相关资源
    最近更新 更多