使用 Any() 关键字 [duplicate] 对反射属性的值进行 Null 检查

Null check for reflected property's value with Any() keyword [duplicate]

提问人:davedno 提问时间:2/26/2021 最后编辑:Svyatoslav Danylivdavedno 更新时间:2/26/2021 访问量:130

问:

我有一个 Entity Framework DAL 对象列表,我在其中使用可以包含逗号的查询参数字符串。我正在尝试从 DAL 列表中获取满足查询参数字符串中值的所有对象。

我有以下 Linq 语句,它产生了我所期望的结果:

dalList = dalList
   .Where(aa => queryParamString.Split(',')
      .Any((x => (aa.GetType().GetProperty(kvp.Key).GetValue(aa, null)).ToString().ToLower() == x.ToLower())))
   .ToList();

如果列表不包含反射属性的 null 值,则上述语句工作正常。

如何在此 Linq 语句中包含 null 检查以避免在第一次 ToString() 方法调用时出现 NullReferenceException?

编辑:kvp。键是数据库列的字符串表示形式

C# 实体框架 LINQ 反射 NullReferenceException

评论

1赞 Renat 2/26/2021
?.ToString()?.ToLower()
1赞 davedno 2/26/2021
@Renat 这似乎奏效了。如果您发布答案并简单解释如何?操作数在这里表现良好,我很乐意投赞成票并接受答案。
0赞 NetMage 2/26/2021
?.null 条件运算符之一。
0赞 Peter Duniho 2/26/2021
第二个重复项说 VB.NET,但当然 C# 中也存在完全相同的语法。

答:

2赞 Renat 2/26/2021 #1

null 条件运算符可用于使 null 检查更简洁,并避免 null 引用异常。?.

来自 MSDN 的评估结果如下:a?.x

  • 如果计算结果为 ,则 ...是。anulla?.xnull
  • 如果计算结果为非 null,则 ...和结果一样......aa?.xa.x

所以因为可以返回,为了避免在调用时出现空引用异常,我们可以使用 ,在空值的情况下,它只返回空而没有 NRE。.GetValue(aa, null)nullToString()null.GetValue(aa, null)?.ToString()

那么即使算子是短路算子,一般也可以返回,所以最好在 .这变成了:?.ToString()nullToString()?.ToLower()

GetValue(aa, null)?.ToString()?.ToLower() == x.ToLower()

并且(此处为字符串相等运算符)允许将 S 作为参数,因此我们在这里不会出现 null 引用异常。==null

评论

1赞 NetMage 2/26/2021
我想最好确定一下,但 Microsoft 的建议是,即使返回类型可能是为了向后兼容(也许他们有一天可以解决这个问题),也不应该返回。ToStringnullstring?