在字符串中找到特定的数字

时间:2018-06-21 07:07:36

标签: c# linq-to-sql

我正在尝试从数据库中获取行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。

2 个答案:

答案 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();

There is a tutorial on doing this sort of thing here

相关问题