如何将全0空GUID转为null以适配数据库null值的查询匹配
解决方案
你可以通过参数预处理或者查询条件兼容两种方式处理空GUID到NULL的映射:
方案1:预先转换查询参数(兼容性最高)
在构建查询前先把入参中的全0GUID转换为可空GUID的null值,绝大多数ORM会自动将== null的等值条件转换为SQL的IS NULL语法,匹配数据库的存储值:
// 预处理过滤参数:空GUID转null Guid? countryFilter = request.CountryId == Guid.Empty ? null : request.CountryId; // 修改后的查询语句 var characteristicPrices = await scope.BuildQuery<CharacteristicPrice, CharacteristicVersion, CharacteristicPrice>((op, ccp, cv) => op.Select(op.AllColumnsOf(ccp)) .InnerJoin<CharacteristicVersion>(cv.Id == ccp.CharacteristicVersionId) .Where(ccp.CountryId == countryFilter && cv.VersionId == request.VersionId)).Get();
方案2:查询条件直接兼容(无需改动外部参数)
如果不希望提前处理参数,也可以直接在Where表达式中写分支判断:
var characteristicPrices = await scope.BuildQuery<CharacteristicPrice, CharacteristicVersion, CharacteristicPrice>((op, ccp, cv) => op.Select(op.AllColumnsOf(ccp)) .InnerJoin<CharacteristicVersion>(cv.Id == ccp.CharacteristicVersionId) .Where( (request.CountryId == Guid.Empty ? ccp.CountryId == null : ccp.CountryId == request.CountryId) && cv.VersionId == request.VersionId )).Get();
注意事项
- 请确保实体类
CharacteristicPrice的CountryId属性定义为可空类型Guid?,否则ORM无法正确生成IS NULL查询语句 - 如果你使用的ORM不支持条件表达式的自动解析,优先使用方案1的预处理逻辑
内容的提问来源于stack exchange,提问作者jiyanyasli
相关产品推荐
相关产品推荐

