我正在尝试从数据库中获取行ID,其中其列(字符串)之一包含特定数字
例如,给定的数据库结构
id parent_id
--- -----------
1 12, 240, 79
2 13, 24, 46
3 24
我要查找的数字是24。
因此,结果应为2、3。
这是我到目前为止尝试过的
var childId = _context.tblName.Where(x => x.parent_id.Contains("24")).Select(x => x.id).ToList();
但是上面的表达式将返回所有id。
答案 0 :(得分:-1)
如果要在服务器端完全进行比较,则需要多个条件,这些条件可以解析为LIKE
或=
语法:
var childId = _context.tblName.Where
(x => x.parent_id == "24" ||
x.parent_id.StartsWith("24, ") ||
x.parent_id.EndsWith(" 24") ||
x.parent_id.Contains(" 24,")).Select(x => x.id).ToList();
一种不太有效的方法是Regex
。只需插入一个与数字24匹配的简单正则表达式即可。请注意,计算将在客户端进行:
var childId = _context.tblName.Where(x => Regex.Match(x.parent_id, @"(?:[^\d]|^)(24)(?:[^\d]|$)").Groups.Count > 1).Select(x => x.id).ToList();
答案 1 :(得分:-1)
我发现用分隔符将字符串包装起来很容易,这样您就知道可以在字符串中的任意位置找到一个特定的搜索词。如果您确定示例中显示的格式将始终遵循(数字逗号空格号...),请使用以下方法:
childId = _context.tblName.Where(x => $", {x.parent_id},".Contains(", 24,")).Select(x => x.id).ToList();
如果在某些情况下不包含空格,则也要先删除空格。
childId = _context.tblName.Where(x => $",{x.parent_id.Replace(" ", "")},".Contains(",24,")).Select(x => x.id).ToList();
您可以先减少执行首次搜索时返回的数据,然后再应用此过滤器:
childId = _context.tblName.Where(x => x.parent_id.Contains("24")).Where(x => $", {x.parent_id},".Contains(", 24,")).Select(x => x.id).ToList();
编辑: 如果您真的非常关心性能,并且只返回表中的行,那么您实际上可以自己指定SQL。
childId = _context.tblName
.SqlQuery("SELECT * FROM tblName WHERE ', ' + parent_id + ',' LIKE '%, 24,%'")
.ToList<recordType>().Select(x => x.id).ToList();
可以通过仅从表而不是整行中获取ID来进一步改进。而且您当然应该参数化!
childId = _context.Database
.SqlQuery<string>("SELECT id FROM tblName WHERE ', ' + parent_id + ',' LIKE '%, ' + @search + ',%'", new SqlParameter("@search", 24))
.ToList();