MySQL查询语句能否简化?适用于EF Core(Lambda)及原生SQL
简化双唯一键(含可空列)的Account表查询语句
针对你的account表(ain非空唯一,schemecode可空且参与唯一约束),以下是三种常见查询场景的简化写法,覆盖原生SQL和EF Core Lambda表达式:
原生SQL简化方案
场景1:匹配指定ain和schemecode(包含schemecode为NULL的情况)
原冗长语句通常需要手动处理NULL匹配逻辑,可根据数据库兼容性选择两种简化方式:
- 支持
IS NOT DISTINCT FROM的数据库(SQL Server 2022+、PostgreSQL、MySQL 8.0+):SELECT * FROM account WHERE ain = @ain AND schemecode IS NOT DISTINCT FROM @schemecode; - 兼容性兼容写法(适配所有SQL数据库):
注:SELECT * FROM account WHERE ain = @ain AND COALESCE(schemecode, '') = COALESCE(@schemecode, '');''可替换为一个不会与实际schemecode值冲突的特殊标记
场景2:查询指定ain下的所有记录
此场景逻辑本身简洁,直接保留基础写法即可:
SELECT * FROM account WHERE ain = @ain;
场景3:匹配指定schemecode(包含schemecode为NULL的情况)
同样利用NULL匹配简化逻辑:
- 支持
IS NOT DISTINCT FROM的数据库:SELECT * FROM account WHERE schemecode IS NOT DISTINCT FROM @schemecode; - 兼容性兼容写法:
SELECT * FROM account WHERE COALESCE(schemecode, '') = COALESCE(@schemecode, '');
EF Core Lambda表达式简化方案
场景1:匹配指定ain和schemecode(包含schemecode为NULL的情况)
- 支持
EF.Functions.IsNotDistinctFrom的数据库(对应SQL的IS NOT DISTINCT FROM):var targetAccount = dbContext.Accounts .Where(a => a.Ain == targetAin && EF.Functions.IsNotDistinctFrom(a.SchemeCode, targetSchemeCode)) .FirstOrDefault(); - 通用兼容写法(EF Core可自动翻译
Nullable.Equals为正确的NULL匹配SQL):var targetAccount = dbContext.Accounts .Where(a => a.Ain == targetAin && Nullable.Equals(a.SchemeCode, targetSchemeCode)) .FirstOrDefault();
场景2:查询指定ain下的所有记录
直接使用基础过滤逻辑:
var accountsByAin = dbContext.Accounts .Where(a => a.Ain == targetAin) .ToList();
场景3:匹配指定schemecode(包含schemecode为NULL的情况)
- 支持
EF.Functions.IsNotDistinctFrom的数据库:var accountsBySchemeCode = dbContext.Accounts .Where(a => EF.Functions.IsNotDistinctFrom(a.SchemeCode, targetSchemeCode)) .ToList(); - 通用兼容写法:
var accountsBySchemeCode = dbContext.Accounts .Where(a => Nullable.Equals(a.SchemeCode, targetSchemeCode)) .ToList();
额外优化建议
如果需要频繁复用这些查询逻辑,可以:
- 原生SQL:封装为存储过程或自定义SQL函数
- EF Core:编写扩展方法(如
WhereAccountByAinAndSchemeCode),避免重复编写过滤条件
内容的提问来源于stack exchange,提问作者Lajith
相关产品推荐
相关产品推荐

