LinqToSql запрос, который охватывает отношение многие ко многим? - PullRequest
0 голосов
/ 30 октября 2009

Допустим, у меня есть следующая схема

Content(Id, ....)
TagContent(TagId, ContentId)
Tag(TagId, Name)

Предположим, я хотел бы выбрать все записи контента, которые имеют тег с именем "test".

В SQL я бы написал:

select Content.Id 
from Content 
       join TagContent as TC on (TC.ContentId = Content.Id)
       Join Tag on (TC.TagId = Tag.Id)
where Tag.Name = 'Test'

Не могли бы вы предложить, как написать аналогичный запрос в Linq, если у вас есть только таблица доступна? (Я хотел бы создать метод расширения Content.ByTag ('tag') -> IQueryable)

Мне только удалось создать запрос, который использует оператор sql exists вместо join. Это означает, что запросы крайне неэффективны.

Мое текущее неэффективное решение выглядит следующим образом:

DataContext.Contents.Where(c => c.TagContents.Any(tc => tc.Tag.Name == "Test"))

Примечание: Поскольку я хотел бы создать метод расширения для DataContext.Contents, у меня не будет доступа к другим таблицам, таким как DataContext.Tag и DataContext.ContentTag.

1 Ответ

0 голосов
/ 30 октября 2009

Нечто подобное возможно

var contentIds = from c in Content
                     join tc in TagContent on c.Id equals tc.ContentId
                     join t in Tag on tc.TagId equals t.Id
                     where t.Name == "Test"
                     select new 
                     {
                        ContentId = c.Id
                     };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...