包含字符串数组的Linq

本文关键字:Linq 数组 字符串 包含 | 更新日期: 2023-09-27 18:00:33

我有一个项目的字符串数组&数据库对象的列表,我想从中进行选择查询

List<string> target_terms = new List<string> { "car", "mechanic" }
if (isNotExactPhrase)
{
    List<int> _tagIds = (from item in dbContext.Tags
                    where target_terms.Any(w => item.TagName.Contains(w))
                    select item.TagId).ToList();
}

我想要数组中所有带有名称的标签

我必须使用两个选项,我想检查标记名是否包含任何关键字&如果搜索的是确切的短语,那么我想检查任何标记名==任何关键字

但对于这个查询,我得到了错误

本地序列不能用于查询的LINQ到SQL实现除Contains运算符之外的运算符。

如何解决这个问题?

包含字符串数组的Linq

尝试此查询

var _tagIds = (from item in dbContext.Tags
                    where keywords.contains(item.TagName)
                    select item.TagId).ToList();

没有直接的等价物,但根据模式的不同,有一些方法可以类似地工作。

string.Contains("pattern")相当于LIKE'%pattern%'

string.StartsWith("pattern")相当于LIKE"pattern%"

string.EndsWith("pattern")相当于LIKE'%pattern'

在多次遇到这个问题后,我创建了一个nuget包来解决这个常见问题。

使用NinjaNye.SearchExtensions,您可以执行以下操作:

var _tagIds = dbContext.Tags.Search(t => t.TagName)
                            .Containing(keywords)
                            .Select(t => t.TagId)
                            .ToList();

如果需要,您还可以搜索多个属性,并返回在任一属性中找到匹配项的记录。

var _tagIds = dbContext.Tags.Search(t => t.TagName, t => t.Description)
                            .Containing(keywords)
                            .Select(t => t.TagId)
                            .ToList();

希望这能帮助

尝试用contains 替换Any

List<int> _tagIds = (from item in dbContext.Tags
                    where target_terms.Contains(w => item.TagName.Contains(w))
                    select item.TagId).ToList();