Как получить элементы, отмеченные всеми указанными тегами в linq?

Кажется, у меня проблемы с этим. У меня есть таблица задач с идентификатором и таблицей тегов, которая имеет поле тега и ограничение внешнего ключа в таблице задач.

Я хочу иметь возможность выполнять И ищет задачи по тегам. Например, если я ищу задачи с тегами «переносимость» и «тестирование», мне не нужны задачи, отмеченные «переносимостью», а не «тестирование».

Я попробовал следующий синтаксис:

var tasks = (from t in _context.KnowledgeBaseTasks where t.KnowledgeBaseTaskTags.Any(x => tags.Contains(x.tag)) select KnowledgeBaseTaskViewModel.ConvertFromEntity(t) ).ToList(); 

Это, конечно, поиск OR, а не поиск И. Я не могу понять, как на самом деле переключить это на поиск AND.

Редактировать Мне также нужно найти 2 из X-тегов, которые содержит задача. Поэтому, если задача отмечена «bugfix», «переносимостью», «тестированием» и я ищу «тестирование» и «переносимость», эта задача все равно будет отображаться.

Вы хотите сделать это

LinqToSql может выглядеть так:

 List myTags = GetTagIds(); int tagCount = myTags.Count; IQueryable subquery = from tag in myDC.Tags where myTags.Contains(tag.TagId) group tag.TagId by tag.ContentId into g where g.Distinct().Count() == tagCount select g.Key; IQueryable query = myDC.Contents .Where(c => subQuery.Contains(c.ContentId)); 

Я не тестировал это, а бит Distinct мог бы быть немного. Проверьте сгенерированный sql, чтобы быть уверенным.

Используйте все вместо Any; и только для выбора KnowledgeBaseTasks, который имеет все tags (но, возможно, больше); отмените выражение:

 var tasks = (from t in _context.KnowledgeBaseTasks where tags.All(tag => t.KnowledgeBaseTaskTags.Contains(tag)) select KnowledgeBaseTaskViewModel.ConvertFromEntity(t) ).ToList();