我需要按标签搜索数据库用户。一个用户有许多标签,许多用户共享一个标签。 但是,当我按特定的标签集搜索时,我希望用户拥有所有这些标签,但可以拥有我不会搜索ofc的标签。 以下是我的尝试:
return context.Contacts.Include("Tags").Where(c => c.Tags.**Any**(t => tagIds.Contains(t.Id.ToString()))).ToList();
//Above approach would search kind of union between tags. It would not converge. Meaning if I have user1 with tags A and B and user2 with B and C And I search by A and B i would get both users, even though i want only user1
// Bellow apporach搜索过于严格,这意味着如果用户包含标签A和B,并且我按标签A搜索,则该用户将无法显示
return context.Contacts.Include("Tags").Where(c => c.Tags.**All**(t => tagIds.Contains(t.Id.ToString()))).ToList();
答案 0 :(得分:1)
您可以使用LinqKit包中提供的PredicateBuilder类
在您的包管理器控制台中:
Install-Package LinqKit
然后按如下方式使用PredicateBuilder:
var predicate = PredicateBuilder.True<Contact>();
foreach (var tagId in tagIds)
{
predicate = predicate.Or(c => c.Tags.Any(tag => tag.Id.ToString() == tagId));
}
var contactsByTags = context.Contacts.Include("Tags").Where(predicate).ToList();