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