Linq-to-Sql与多个包含

时间:2019-04-06 03:40:50

标签: sql linq linq-to-sql

下面的查询是一个具有多个OR条件的简单查询,基本上可以查看searchString是否包含在以下三个字段中的任何一个中:ItemID,ItemID2或ItemDescription。如果searchString为“ 3/4 pipe”,它将仅返回包含“ 3/4 pipe”的记录。我需要它返回同时包含“ 3/4”和“管道”的记录,以便包括诸如“ 3/4钢管”或“ 3/4铜管”或“ 3/4线的管道”之类的记录。本质上,结果值需要在searchString中包含两个单词。不会返回“ 3/4铜”或“铜管”,因为它们都不同时包含“ 3/4”和“管”。

为了增加乐趣,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();

1 个答案:

答案 0 :(得分:0)

显然searchString中的分隔符是空格字符。因此,首先需要将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()首先将所有表记录都放入内存,然后对对象进行搜索。但是,您应该注意它存在性能问题。

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();