LINQ Expression处理可空字符串字段报NullReferenceException如何解决?
LINQ Expression 可空字符串字段兼容调整方案
报错的根本原因是当可空字符串字段值为null时,代码直接调用Contains、ToLower等字符串实例方法,触发空引用异常。调整思路是在方法调用前增加字段非空判断,仅当字段不为null时执行对应方法,否则直接返回符合业务逻辑的默认值。
1. Contains 逻辑调整
// 调整后的Contains代码 Expression expressionSub = null; MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string), typeof(StringComparison) }); var comparisonValue = Expression.Constant(StringComparison.OrdinalIgnoreCase, typeof(StringComparison)); var actualValue = Expression.Constant(propertyValue, typeof(string)); // 新增字段null判断 var isNullExp = Expression.Equal(propertyName, Expression.Constant(null, typeof(string))); // 字段为null时直接返回false,否则执行Contains调用 var containsExp = Expression.Call(propertyName, method, actualValue, comparisonValue); expressionSub = Expression.Condition(isNullExp, Expression.Constant(false), containsExp); return expressionSub;
逻辑说明:如果字段值为null,默认不存在匹配的包含关系,直接返回false,避免调用实例方法触发空引用。
2. Equal/NotEqual 逻辑调整
// 调整后的Equal/NotEqual代码 MethodInfo method = typeof(String).GetMethod("ToLower", Type.EmptyTypes); var constValue = propertyValue?.ToString().ToLower(); var constExp = Expression.Constant(constValue, typeof(string)); // 新增字段null判断 var isNullExp = Expression.Equal(propertyName, Expression.Constant(null, typeof(string))); // 字段为null时直接用null参与比较,不为null时再调用ToLower var valueExp = Expression.Condition(isNullExp, Expression.Constant(null, typeof(string)), Expression.Call(propertyName, method)); if (operatorName == "equal") return Expression.Equal(valueExp, constExp); else if (operatorName == "notequal") return Expression.NotEqual(valueExp, constExp); else return null;
逻辑说明:兼容null值比较场景,当字段为null时,直接和目标值做相等判断,不会调用ToLower方法,同时支持查询字段值为null的场景。
可选优化
如果业务逻辑中需要将null和空字符串视为等价,可将null判断逻辑修改为:
var isNullOrEmptyExp = Expression.OrElse( Expression.Equal(propertyName, Expression.Constant(null, typeof(string))), Expression.Equal(propertyName, Expression.Constant(string.Empty)) );
对应分支返回空字符串的处理结果即可。
内容的提问来源于stack exchange,提问作者user3501613
相关产品推荐
相关产品推荐

