Кажется, у меня проблемы с этим. У меня есть таблица задач с идентификатором и таблицей тегов, которая имеет поле тега и ограничение внешнего ключа в таблице задач.
Я хочу иметь возможность выполнять И ищет задачи по тегам. Например, если я ищу задачи с тегами «переносимость» и «тестирование», мне не нужны задачи, отмеченные «переносимостью», а не «тестирование».
Я попробовал следующий синтаксис:
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();