如何用EF Core、Linq/SQL Server实现字符串交集查询?
问题描述
需要判断输入字符串数组与SQL Server中存储的逗号分隔字符串是否存在匹配关系,现有实体类及Linq查询代码如下:
class Meeting { public int Id { get; set; } public string? MeetingName { get; set; } public string DbColumnCommaSeparated { get; set; } } meetingQuery.Where(x => ArrayOfInputString .Any(y => x.DbColumnCommaSeparated.Split(",").Contains(y)))
请问是否可以通过EF Core的DbFunctions及SQL的STRING_SPLIT函数实现该查询?
解决方案
完全可以通过EF Core结合SQL Server的STRING_SPLIT函数实现该查询,且能将逻辑全量推送到数据库端执行,避免客户端拉取数据后再过滤的性能损耗。
实现代码
直接利用EF Core封装的EF.Functions.StringSplit方法(对应SQL Server的STRING_SPLIT),结合Linq的Any完成匹配判断:
var inputValues = ArrayOfInputString; var matchedMeetings = meetingQuery.Where(m => inputValues.Any(val => EF.Functions.StringSplit(m.DbColumnCommaSeparated, ",") .Any(splitVal => splitVal == val) ) );
关键说明
EF.Functions.StringSplit会将数据库中逗号分隔的字符串拆分为行数据,整个查询会被EF Core转换为原生SQL执行,能利用数据库的索引优化性能。- 如果数据库中存储的字符串存在空格(例如
"a, b, c"),需要先做去除空格处理,可修改为:EF.Functions.StringSplit(EF.Functions.LTrim(EF.Functions.RTrim(m.DbColumnCommaSeparated)), ",") .Any(splitVal => EF.Functions.LTrim(EF.Functions.RTrim(splitVal)) == val)
内容的提问来源于stack exchange,提问作者Abhijeet
相关产品推荐
相关产品推荐

