下面的查询是一个具有多个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();
答案 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();