我有一个遗留数据库,它将数据元素存储为单个数据库字段中的逗号分隔列表。 (我没有设计,我只是坚持下去。)
我有一个字符串列表,我希望与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条记录。我需要让它返回两个记录。
有什么建议吗?
答案 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;