ASP.NET EF LINQ - 按标签搜索

时间:2016-07-09 21:05:13

标签: c# asp.net entity-framework linq

我需要按标签搜索数据库用户。一个用户有许多标签,许多用户共享一个标签。 但是,当我按特定的标签集搜索时,我希望用户拥有所有这些标签,但可以拥有我不会搜索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();

1 个答案:

答案 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();