Dotnet EF Core 如何正确查询逗号分隔UserIds字段匹配指定UserId
解决方案
最优方案:调整表结构(推荐)
废弃逗号拼接存储UserIds的方案,新增PostUser关联表存储Post和User的多对多映射关系,符合关系数据库第一范式,查询性能、可维护性都远高于字符串拼接方案,查询时直接关联表过滤即可,不存在匹配误差问题。兼容现有表结构方案1:字符串首尾补逗号匹配
给UserIds字段前后统一拼接英文逗号后再做包含匹配,可完全避免单数字匹配多位数的误差,该写法可被EF Core正常转译为SQL,无需客户端计算:
生成的SQL逻辑等价于DBContext.Posts.Where(_ => ("," + _.UserIds + ",").Contains($",{targetId},")).ToList();WHERE CONCAT(',', UserIds, ',') LIKE '%,{targetId},%',匹配完全精准。兼容现有表结构方案2:使用数据库内置拆分函数(仅支持SQL Server 2016+/MySQL 8.0+等支持字符串拆分函数的数据库)
调用数据库原生的字符串拆分函数将UserIds拆分为行后匹配,性能优于字符串拼接模糊匹配:// SQL Server 场景写法 DBContext.Posts.Where(_ => EF.Functions.StringSplit(_.UserIds, ',').Contains(targetId.ToString())).ToList();
内容的提问来源于stack exchange,提问作者Jihai
相关产品推荐
相关产品推荐

