从存储在DB字段中的数组中的列表中查找项目

时间:2013-03-04 21:01:19

标签: linq entity-framework

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

我有一个字符串列表,我希望与DB字段中“array”中的任何单个值匹配,我不知道如何在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条记录。我需要让它返回两个记录。

有什么建议吗?

2 个答案:

答案 0 :(得分: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+",")))

答案 1 :(得分: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;