我正在构建一个linq查询,它将检查DB中的字符串是否包含字符串列表中的任何字符串。
类似的东西。
query = query.Where(x => x.tags
.Contains(--any of the items in my list of strings--));
我也想知道列表中有多少项是匹配的。
任何帮助都将不胜感激。
更新:我应该提到标签是一个字符串而不是列表。而且我在查询实际运行之前添加了几个与标签无关的内容。这是针对实体框架运行的。
答案 0 :(得分:15)
编辑:这个答案假设tags
是字符串的集合......
听起来你可能想要:
var list = new List<string> { ... };
var query = query.Where(x => x.tags.Any(tag => list.Contains(tag));
或者:
var list = new List<string> { ... };
var query = query.Where(x => x.tags.Intersect(list).Any());
(如果这是使用LINQ to SQL或EF,你可能会发现一个可以工作,但另一个没有。在LINQ to Objects中,两者都可以工作。)
要获得计数,你需要类似的东西:
var result = query.Select(x => new { x, count = x.tags.Count(tag => list.Contains(tag)) })
.Where(pair => pair.count != 0);
然后result
的每个元素都是一对x
(项目)和count
(匹配标记的数量)。
答案 1 :(得分:2)
List<string> list = new List<string>();
list.Add("One");
list.Add("Two");
var result = query.Where(x => list.Contains(x.tags));
答案 2 :(得分:2)
之前我做过类似的事情:
var myList = new List<string>();
myList.Add("One");
myList.Add("Two");
var matches = query.Where(x => myList.Any(y => x.tags.Contains(y)));
答案 3 :(得分:0)
我不能确定你的问题是x.tags是一个字符串还是列表,如果它是一个列表Jon Skeet的答案是正确的。如果我理解正确,虽然x.tags是一串字符串。如果是,那么解决方案是:
list.Any(x => x.tags.IndexOf(x) > -1)
算上他们吗
list.Count(x => x.tags.IndexOf(x) > -1)
答案 4 :(得分:0)
我最近遇到了类似的问题,以下是我设法解决的方法:
var list = [list of strings];
if (list != null && list.Any())
{
queryable = queryable.Where(x => x.tags != null);
var tagQueries = new List<IQueryable<WhateverTheDbModelIs>>();
foreach (var element in list)
{
tagQueries.Add(queryable.Where(x => x.tags.Contains(element)));
}
IQueryable<WhateverTheDbModelIs> query = tagQueries.FirstOrDefault();
foreach (var tagQuery in tagQueries)
{
query = query.Union(tagQuery);
}
queryable = queryable.Intersect(query);
}
可能不是最好的选择,但一些经验不足的开发人员可以理解和使用
答案 5 :(得分:-1)
var t = new List<string> { "a", "b", "c" };
var y =“a b d”;
var res = y.Count(x =&gt; t.Contains(x.ToString()));