Как получить элементы, помеченные всеми предоставленными тегами в linq? - PullRequest
1 голос
/ 13 августа 2010

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

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

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

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

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

Edit Мне также нужно иметь возможность искать 2 из X тегов, содержащихся в задаче.Поэтому, если задача помечена как «bugfix», «portability», «testing», а я ищу «test» и «portability», эта задача все равно будет отображаться.

Ответы [ 2 ]

3 голосов
/ 13 августа 2010

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

var tasks = (from t in _context.KnowledgeBaseTasks
                 where tags.All(tag => t.KnowledgeBaseTaskTags.Contains(tag))
                 select KnowledgeBaseTaskViewModel.ConvertFromEntity(t)
                ).ToList();
2 голосов
/ 13 августа 2010

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

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

List<int> myTags = GetTagIds();
int tagCount = myTags.Count;

IQueryable<int> 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<Content> query = myDC.Contents
  .Where(c => subQuery.Contains(c.ContentId));

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

...