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

EF Core多表Join查询如何实现带%通配符的前缀匹配关联

EF Core 前缀匹配SKU关联查询调整方案

核心问题

EF Core 标准 join ... on ... equals ... 语法仅支持等值匹配,你原代码里写的 on so.ItemSku equals p.Sku + '%' 会被解析为精确匹配Sku字段值末尾带%字符的记录,完全无法实现LIKE前缀匹配的逻辑。

正确实现代码

把非等值的LIKE关联逻辑从join条件移到where子句,同时优化日期过滤的写法(避免字符串匹配带来的性能问题),最终代码如下:

var targetDate = nowTime.Date;
var TodaysList = (
    from b in _context.BarcodeScan
    join so in _context.ShipStationAwaitingOrder
        on b.ShipStationOrderId equals so.SSOrderId
    from p in _context.Product
        // 等价于SQL中 s.ItemSKU LIKE p.Sku + '%' 的匹配逻辑
        where EF.Functions.Like(so.ItemSku, p.Sku + "%")
        // 日期区间判断,比字符串LIKE性能更好,可命中索引
        where b.ModifyDate >= targetDate && b.ModifyDate < targetDate.AddDays(1)
    select new
    {
        ModifyDate = b.ModifyDate,
        SKU = so.ItemSku,
        IsEmbroidery = p.IsEmbroidery,
        IsEngraving = p.IsEngraving,
        IsMetal = p.IsMetal,
        IsUV = p.IsUv
    }
).ToList();

注意事项

  • 非等值关联(包括LIKE、大小比较等逻辑)不能用常规的equals join写法,改用from 关联表 where 关联条件的写法后,EF Core会自动识别关联关系,生成和手写SQL一致的INNER JOIN语句,不会产生笛卡尔积。
  • 上述代码里的EF.Functions.Like(so.ItemSku, p.Sku + "%")会被EF Core直接翻译为SQL Server原生的LIKE匹配逻辑,完全符合你需要的「前缀SKU匹配尾部带额外内容SKU」的需求,比如WERTY123可以正确关联到WERTY123blah。
  • 日期过滤改用时间区间判断,相比原写法里转字符串再LIKE匹配的方式,性能更高,也能避免不同日期格式带来的匹配错误。

内容的提问来源于stack exchange,提问作者OutsideToday

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:42:24