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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:19:54