带有字符串数组的 Linq 包含

Linq with String Array Contains

我有一个项目字符串数组和一个数据库对象列表,我想从中执行 select 查询

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

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

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

但是对于这个查询我收到了错误

Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.

如何解决?

试试这个查询

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'

尝试用 contains

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

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

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

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

如果需要,您还可以搜索在 属性.

中找到匹配项的多个属性和 return 记录
var _tagIds = dbContext.Tags.Search(t => t.TagName, t => t.Description)
                            .Containing(keywords)
                            .Select(t => t.TagId)
                            .ToList();

希望对您有所帮助