Intereting Posts
Как изменить доступность в Accessor с помощью CodeDom? Добавить функции VSIX в библиотеку classов C # Как вернуть маршал значения функций WinApi? Как я могу безопасно зацикливаться до тех пор, пока вам нечего делать, не используя «placeholder» в то время как conditon? Захват исключений из асинхронных запросов HttpWebRequest в задаче WPF Desktop App, Windows 10 Notification Toast 2016 (набор инструментов сообщества UWP) При использовании шаблона MVVM должен ли код, связанный с изменениями свойств, идти в сеттер или событие? Инъекция зависимостей Unity с атрибутом фильтра глобальных веб-API Вызов Pocketsphinx в C # AccesViolationException Что такое «родной» и «буквенный» ключевые слова Ошибка преобразования типа при настройке свойства путем отражения Смутно о «переопределении» против «нового» в C # Изображения размыты в ImageList с помощью ListView в окне Application Как преобразовать DataTable в список с использованием отражений Обработка огромных файлов в C #

Как получить элементы, отмеченные всеми указанными тегами в 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();