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

Entity Framework Core Contains方法未返回预期数据问题排查

问题原因与解决方案

问题根源

EF Core生成的SQL中出现( ( @__faultCode_4 LIKE N'' ) OR CHARINDEX( @__faultCode_4, [b].[ContentWords] ) > 0 ),是因为你传入的faultCode变量可能为空字符串或者null。EF Core的默认行为是:当调用string.Contains()时,如果传入的字符串为空,会自动生成“匹配所有行”的逻辑(即OR空字符串的条件),但这和你原SQL中LIKE '%P2002%'的严格匹配逻辑不符,导致统计结果偏少。

解决方案

方法1:使用EF.Functions.Like显式生成LIKE语句

替换ContentWords.Contains(faultCode)为EF Core的原生Like函数,确保生成和原SQL一致的LIKE '%xxx%'条件,不受空值影响:

// 第二个查询修改最后一个Where条件
.Where(bulletin => EF.Functions.Like(bulletin.ContentWords, $"%{faultCode}%"))

这样生成的SQL会直接是[b].[ContentWords] LIKE N'%P2002%',和原SQL逻辑完全一致。

方法2:提前校验并过滤空值

如果faultCode为空时不需要这个筛选条件,或者需要强制空值时不匹配任何行,可以手动处理:

var secondCountQuery = _db.Bulletins
    .Where(bulletin => lookupStatusCodes.Contains(bulletin.Status))
    .Where(bulletin => bulletin.LangID == langId)
    .Where(bulletin => new[] { 1, 2 }.Contains(bulletin.Owner));

// 仅当faultCode非空时添加包含条件
if (!string.IsNullOrEmpty(faultCode))
{
    secondCountQuery = secondCountQuery.Where(bulletin => bulletin.ContentWords.Contains(faultCode));
}

这种方式可以灵活控制空值情况下的逻辑,避免EF Core自动生成不符合预期的OR条件。

额外说明

第一个查询结果符合预期,可能是因为firstCountQuery中关联后的ContentWords数据里,即使有OR空值的条件,实际匹配的行数刚好和预期一致,但本质上逻辑还是存在隐患,建议也统一替换为EF.Functions.Like来保持逻辑一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:46:17