具有多个包含的 Linq-to-Sql

Linq-to-Sql with Multiple Contains

下面的查询是一个带有多个 OR 条件的简单查询,主要是查看 searchString 是否包含在以下 3 个字段中的任何一个中:ItemID、ItemID2 或 ItemDescription。如果 searchString 是“3/4 pipe”,它只会 return 包含“3/4 pipe”的记录。我需要它 return 包含“3/4”和 "pipe" 的记录,以便记录如“3/4 钢管”或“3/4 铜管”或 "pipe for 3/4 wire"被包含在内。本质上,结果值需要包含 searchString 中的两个词。 “3/4 铜”或 "copper pipe" 不会被 return 编辑,因为它们都不包含“3/4”和 "pipe"。

为了增加乐趣,searchString 可以包含任意数量的单词。

IEnumerable<Item> query = from item in context.Items
                                  where item.ItemID.ToUpper().Contains(searchString) ||
                                  item.ItemID2.ToUpper().Contains(searchString) ||
                                  item.ItemDesc.ToUpper().Contains(searchString)
                                  orderby item.ItemClassID, item.ItemID ascending
                                  select item;
        return query.ToList();

显然您 searchString 中的分隔符是 space 字符。因此,首先您需要将 searchString 拆分为一个字符串数组:

var searchStringList = searchString.Split(' ');

然后您可以检查指定的任何列是否包含字符串列表中的所有项目,例如:

searchStringList.All(x => item.ItemID.ToUpper().Contains(x))

最后会变成这样:

var searchStringList = searchString.Split(' ');

IEnumerable<Item> query = from item in context.Items
                                  where searchStringList.All(x => item.ItemID.ToUpper().Contains(x)) ||
                                  searchStringList.All(x => item.ItemID2.ToUpper().Contains(x)) ||
                                  searchStringList.All(x => item.ItemDesc.ToUpper().Contains(x))
                                  orderby item.ItemClassID, item.ItemID ascending
                                  select item;
        return query.ToList();

更新
在您的评论中,上面的代码抱怨本地序列 (searchStringList) 不能在 LINQ to SQL.
中使用 我可以为此提出的一种解决方案是使用 ToList() 首先将所有 table 记录放入内存,然后对对象进行搜索。但是,您应该注意它存在性能问题。

var searchStringList = searchString.Split(' ');

IEnumerable<Item> query = from item in context.Items.ToList()
                                  where searchStringList.All(x => item.ItemID.ToUpper().Contains(x)) ||
                                  searchStringList.All(x => item.ItemID2.ToUpper().Contains(x)) ||
                                  searchStringList.All(x => item.ItemDesc.ToUpper().Contains(x))
                                  orderby item.ItemClassID, item.ItemID ascending
                                  select item;
        return query.ToList();