2009-07-10 4 views
0

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

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

Как это можно сделать?

ответ

0

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

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; 
} 
0

Хм.

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

0
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); 
} 

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

Смежные вопросы