Linq 从数据库字段中存储的数组中的列表中查找项

Linq 从数据库字段中存储的数组中的列表中查找项,linq,entity-framework,Linq,Entity Framework,我有一个遗留数据库,它的数据元素以逗号分隔的列表形式存储在单个数据库字段中。(这不是我设计的,我只是被它卡住了。) 我有一个字符串列表,我想与DB字段中“array”中的任何单个值进行匹配,但不确定如何在Linq中进行匹配 我的名单: List<string> items= new List<string>(); items.Add("Item1"); items.Add("Item2"); 我第一次通过Linq查询是: var results = (from o

我有一个遗留数据库,它的数据元素以逗号分隔的列表形式存储在单个数据库字段中。(这不是我设计的,我只是被它卡住了。)

我有一个字符串列表,我想与DB字段中“array”中的任何单个值进行匹配,但不确定如何在Linq中进行匹配

我的名单:

List<string> items= new List<string>();
items.Add("Item1");  
items.Add("Item2"); 
我第一次通过Linq查询是:

var results = (from o in Order
.Where(p=> items.Contains(p.Products)
但我知道那是行不通的。因为它只返回只包含“Item1”或“Item2”的记录。因此,对于上面的示例数据,它将返回0条记录。我需要它返回两张记录


有什么建议吗?

一种方法是分析
产品
字段中的列表:

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;

搜索逗号分隔列表有一个简单而巧妙的技巧。首先,在目标值(产品列表)和搜索值的开头和结尾添加一个额外的
。然后搜索精确的字符串。例如,您可以搜索
,Item1,Item3,Item4,
,查找
,Item1,
。这样做的目的是防止误报,即
Item1、Item3
查找与
Item1
匹配的项目,同时允许正确查找列表开头/结尾的项目

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

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

您确定可以在实体框架中执行
String.Contains
?IronMan84:我对EF了解不多(我主要使用LINQ to SQL),但我知道
String.Contains
很容易在SQL中表达(例如,
类似于
子句),所以如果它不受支持,我会非常惊讶。似乎表明这是允许的。根据您的建议,当项目不是DB数组中的第一个“字符串”时,我遇到了一个问题。i、 e.如果我在上面的例子中选择了项目3,我将得到记录2,但没有1@JohnS:请仔细检查逻辑是否正确实现。
产品
值和项目前后都有一个逗号。我测试了它,它似乎工作得很好:。你能出示你当前的工作代码吗?我道歉。我在上面示例中使用的数据不像实时数据那样有空格。我在代码中添加了一个o.Products.Replace(“,”),它工作正常。谢谢
var results = (from o in Order
    .Where(o => items.Any(i => (","+o.Products+",").Contains(","+i+",")))