Как мне найти массив значений в отношении многих ко многим? - PullRequest
0 голосов
/ 10 июля 2009

У меня проблема с моей моделью LINQ to Entity. Я новичок в C # и LINQ, так что терпите меня.

У меня есть модель, содержащая рисунки и теги, где каждое изображение может иметь много тегов, и каждый тег может быть на многих изображениях. В БД есть обычная таблица отношений, но в объектной модели я вижу ее как picture.tags (как список) и tag.pictures (как список). Поисковый запрос содержит несколько тегов, и результат поиска должен содержать все изображения, которые отмечены всеми тегами (но, возможно, больше), которые я искал. Количество тегов для поиска не является фиксированным.

Как это лучше всего сделать?

Ответы [ 3 ]

0 голосов
/ 11 июля 2009

Хм.

Я не могу заставить работать вторую строку - Contex.Pictures. Контекст не позволяет этого. И, насколько я вижу, этот алгоритм будет добавлять все изображения, которые соответствуют хотя бы одному тегу, а не только изображения, которые соответствуют всем тегам? Или я не прав?

0 голосов
/ 01 июня 2010
IQueryable<Picture> FindByTags(IEnumerable<string> included, IEnumerable<string> excluded)
{
      return (from p in context.Pictures
              where (from item in p.Tags
                     where included.Contains(item.Tag)
                     select 1).Count() == included.Count()
              where (from item in p.Tags
                     where excluded.Contains(item.Tag)
                     select 1).Count() == 0
              select p);
}

Это также позволит исключить, просто выньте второе место, если вы этого не хотите. Это также работает, только если на картинке нет повторяющихся тегов

0 голосов
/ 10 июля 2009

Есть много способов сделать это. Вот один из способов. Я не собираюсь утверждать, что это «лучший», но это будет работать.

IQueryable<Picture> FindByTags(IEnumerable<string> tags)
{
    var q = Context.Pictures;
    foreach (var tag in tags) 
    {
        q = q.Where(p => p.Tags.Any(t => t.Name == tag));
    }
    return q;
}
...