You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 18:15:03