提问人:davedno 提问时间:2/26/2021 最后编辑:Svyatoslav Danylivdavedno 更新时间:2/26/2021 访问量:130
使用 Any() 关键字 [duplicate] 对反射属性的值进行 Null 检查
Null check for reflected property's value with Any() keyword [duplicate]
问:
我有一个 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。键是数据库列的字符串表示形式
答:
2赞
Renat
2/26/2021
#1
null 条件运算符可用于使 null 检查更简洁,并避免 null 引用异常。?.
来自 MSDN 的评估结果如下:a?.x
- 如果计算结果为 ,则 ...是。
a
null
a?.x
null
- 如果计算结果为非 null,则 ...和结果一样......
a
a?.x
a.x
所以因为可以返回,为了避免在调用时出现空引用异常,我们可以使用 ,在空值的情况下,它只返回空而没有 NRE。.GetValue(aa, null)
null
ToString()
null
.GetValue(aa, null)?.ToString()
那么即使算子是短路算子,一般也可以返回,所以最好在 .这变成了:?.
ToString()
null
ToString()?.ToLower()
GetValue(aa, null)?.ToString()?.ToLower() == x.ToLower()
并且(此处为字符串相等运算符)允许将 S 作为参数,因此我们在这里不会出现 null 引用异常。==
null
评论
1赞
NetMage
2/26/2021
我想最好确定一下,但 Microsoft 的建议是,即使返回类型可能是为了向后兼容(也许他们有一天可以解决这个问题),也不应该返回。ToString
null
string?
评论
?.ToString()?.ToLower()
?.
是 null 条件运算符之一。