2009-05-18 3 views
0

У меня есть классический 3 table - entity, tag и entitytag - структура базы данных.Linqtosql - Найти все объекты, соответствующие всем тегам в запросе

Для того, чтобы найти все объекты, помеченные определенными тегами Я использую следующий LinqToSql код:

string[] myTags = {"tag1","tag2"}; 

var query = from m in entity 
      where m.entitytag.Where(c => myTags.Contains(c.tag.TagName)).Count() == myTags.Count() 
      select m; 

Однако, когда объекты имеют повторяющиеся тег (есть веские причины для этого в моем реальном приложении) query возвращает объекты, которые не соответствуют всем тегам.

например, в приведенном выше примере кода, если объект дважды помечен тегом «tag1», а не «tag2», он вернется в результаты, несмотря на то, что не совпадает с обоими тегами.

Я не могу понять, как исключить эти сущности из результатов?

Или есть совершенно другой подход, который я должен взять?

ответ

0

Как было предложено Эоин, Distinct() должен быть использован, но он не работает против целых наборов entitytag. Использование другого оператора Select для сравнения только с фактическим тегом - вот трюк.

string[] myTags = {"tag1","tag2"}; 

    var query = from m in entity 
    where m.entitytag.Select(et => et.tag.TagName).Distinct().Where(c => myTags.Contains(c)).Count() == myTags.Count() 
    select m; 

К сожалению, недостатком является то, что это несколько ухудшает характеристики.

0

Как об изменении его

where m.entitytag.Distinct().Where(c => ... 

что бы удалить дубликаты entitytags из вашей организации объектов к югу коллекции и позволяют полезных для правильной работы

+0

Я пробовал это, но он все равно возвращает повторяющиеся записи. –

+0

Добавление Select (et => et.tag.TagName) перед тем, как Distinct сделает эту работу. См. Мой ответ на этот вопрос ... –

1

Попробуйте этот запрос вместо:

    string[] myTags = { "tag1", "tag2" }; 
        var query = from m in entity 
           where myTags.All(tag => m.entitytag.Contains(tag)) 
           select m; 
        query.Dump(); 

Метод расширения All - это то, что гарантирует, что каждый тег удовлетворяет критериям содержания.

Существует также любой метод расширения для случаев, когда требуется только один критерий.

Надеюсь, это поможет.

Каван

+0

Недействительно. «тег» в вашем аргументе where имеет тип string, а не entitytag. –

0

Попробуйте

string[] myTags = { "tag1", "tag2" }; 

var query = from e in entity 
      where !myTags.Except(from e.tag select e.tag.TagName).Any() 
      select e; 

Идея заключается в том, чтобы удалить теги аудируемого лица из копии myTags. Любые элементы, оставшиеся после этого, соответствуют тегам, которые отсутствуют в объекте.

Я не знаю, как это работает.

+0

Вам не хватает таблицы сущностей –