如何使用 linq-to-sql 检查 sql 服务器中的字符串是否包含本地列表中的至少一个字符串

本文关键字:字符串 一个 列表 是否 检查 linq-to-sql 何使用 sql 服务器 包含本 | 更新日期: 2023-09-27 18:31:51

在我的数据库字段中,我有一个Positions字段,其中包含一个以空格分隔的位置代码列表。 我需要向查询添加条件,以检查任何本地指定的位置代码是否与字段中的至少一个位置代码匹配。

例如,我有一个包含"RB""LB"的本地列表。 我希望找到仓位值为 OL LB 的记录,以及仓位值为 RB OT 但不是仓位值为 OT OL 的记录。

使用 AND 子句,我可以通过

foreach (var str in localPositionList)
    query = query.Where(x => x.Position.Contains(str);

但是,我需要将其链接为或子句。 如果我不处理 Linq-to-sql(所有普通集合),我可以这样做

query = query.Where(x => x.Positions.Split(' ').Any(y => localPositionList.contains(y)));

但是,这不适用于 Linq-to-sql,因为它无法将拆分转换为 SQL,因此会发生异常。

有什么办法可以做到这一点吗?

我试图抵制将此数据从此表中拆分到其他表中,因为此表的唯一目的是提供优化的数据"缓存",该缓存需要最少数量的表才能获得搜索结果(最终我们将把这部分移到 Solr,但由于时间表,目前不可行)。

如何使用 linq-to-sql 检查 sql 服务器中的字符串是否包含本地列表中的至少一个字符串

我能够通过使用单独的查询并对结果运行Union来获得测试版本。我的代码很粗糙,因为我只是在黑客攻击,但在这里......

        List<string> db = new List<string>() {
            "RB OL",
            "OT LB",
            "OT OL"
        };
        List<string> tests = new List<string> {
            "RB", "LB", "OT"
        };
        IEnumerable<string> result = db.Where(d => d.Contains("RB"));
        for (int i = 1; i < tests.Count(); i++) {
            string val = tests[i];
            result = result.Union(db.Where(d => d.Contains(val)));
        }
        result.ToList().ForEach(r => Console.WriteLine(r));
        Console.ReadLine();