在我的winform应用程序中,我有一个表单,用户可以通过在搜索字段中键入任何文本来搜索产品。例如,产品说明可能会存储为"Adidas aftershave 100Ml"
。但是用户可以键入100 Ml Aftershave
之类的任何内容。所以我想使用linq来查询描述中包含任何这些单词的所有记录(100 Ml Aftershave
)。
到目前为止,我做过类似的事情:
List<string>txtList = txtSearchTerm.Text.Split(' ').ToList();
return dbContext.productRepo.Where(t => txtList.Any(b =>
t.ProductDescription.StartsWith(b)
|| t.ProductDescription.EndsWith(b)
|| t.ProductDescription.Contains(b)
)).Select(x => x.ProductDescription).ToList();
以更好的方式实现这一目标的任何其他方式,使其更快或任何其他改进。
由于
答案 0 :(得分:2)
嗯,您正在测试描述是否开始,结束并包含某些内容。前两个已经是多余的,因为Contains
“包含”它们:
var matchingDescriptions = dbContext.productRepo
.Where(x => txtList.Any(x.ProductDescription.Contains))
.Select(x => x.ProductDescription));
另一个简单的优化(对于Linq-To-Objects),我会先按长度排序:
var txtList = txtSearchTerm.Text.Split(' ').OrderBy(s => s.Length).ToList()
答案 1 :(得分:2)
您可以立即改进的一件事是删除StartsWith
和EndsWith
,因为您已经在做t.ProductDescription.Contains(b)
。
List<string>txtList = txtSearchTerm.Text.Split(' ').ToList();
return dbContext.productRepo.Where(t => txtList.Any(b =>
t.ProductDescription.Contains(b)
)).Select(x => x.ProductDescription).ToList();