2

我有一个遗留数据库,它的数据元素以逗号分隔的列表形式存储在单个数据库字段中。(我没有设计那个,我只是坚持下去。)

我有一个字符串列表,我想与 DB 字段中“数组”中的任何单个值匹配,但不确定如何在 Linq 中执行此操作。

我的列表:

List<string> items= new List<string>();
items.Add("Item1");  
items.Add("Item2"); 

数据库字段“产品”将包含如下数据:

"Item1,Item3,Item4"
"Item3,Item5,Item6"
"Item2,Item7,Item6"
"Item1,Item2"
"Item1"

我第一次通过 Linq 查询是:

var results = (from o in Order
.Where(p=> items.Contains(p.Products)

但我知道那是行不通的。因为它只会返回只包含“Item1”或“Item2”的记录。因此,对于上面的示例数据,它将返回 0 条记录。我需要让它返回两条记录。

有什么建议么?

4

2 回答 2

1

搜索逗号分隔列表有一个简单的聪明技巧。,首先,在目标值(产品列表)和搜索值的开头和结尾添加额外内容。然后搜索那个确切的字符串。例如,您将,Item1,Item3,Item4,搜索,Item1,. 这样做的目的是防止误报,即Item12,Item3找到 的匹配Item1项,同时允许正确找到列表开头/结尾的项目。

然后,您可以使用 LINQ.Any方法检查列表中的任何项目是否与产品列表匹配,如下所示:

var results = (from o in Order
    .Where(o => items.Any(i => (","+o.Products+",").Contains(","+i+",")))
于 2013-03-04T21:06:32.223 回答
0

一种方法是解析Products字段中的列表:

var results = (from o in Order
    .Where(o => items.Any(i => o.Products.Split(',').Contains(i))

但这会为每条记录多次解析字符串。您可以尝试拉回所有记录,解析每条记录一次,然后进行比较:

var results = from o in Order
              let prods = o.Products.Split(',')
              where items.Any(i => prods.Contains(i))
              select o;
于 2013-03-04T21:05:02.640 回答