0

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

例如,我有一个包含"RB"and的本地列表"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,但由于日程安排,目前不可行)。

4

1 回答 1

1

我能够通过使用单独的查询并在结果上运行 a 来获得一个测试版本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();
于 2012-04-20T16:35:49.667 回答