Запрос Linq, выбрать внутренний запрос в список? - PullRequest
0 голосов
/ 17 октября 2010

Я пишу запрос linq для выбора блога,

    from data in dataContext.Blog_BlogPosts
        join tagsData in dataContext.Blog_TagToPostConnections on data.BlogPostID equals tagsData.BlogPostID
        where data.Slug == "asp-programmering"
        select new BlogPost
        {
            Title = data.Title,
            Slug = data.Slug,
            Author = data.Author,
            Text = data.Text,
            Tags = (from tags in dataContext.Blog_Tags where tags.TagID == tagsData.TagID select new Tag { TagID = tags.TagID, TagName = tags.Tag }).ToList()
        };

Класс blogpost выглядит следующим образом (используется для его проверки)

    public class BlogPost
    {
        public string Slug { get; set; }
        public string Title { get; set; }
        public string Text { get; set; }
        public string Author { get; set; }
        public DateTime Published { get; set; }
        public List<Tag> Tags { get; set; }
    }

В блоге, который я тестирую, к нему прикреплены 3 тега. Структура таблицы:

(таблица) BlogPost -> (таблица) BlogPostTags <- (таблица) Теги </p>

Таким образом, таблица BlogPostTags содержит только 2 поля: BlogPostID и TagID.

Когда я запускаю запрос выше, я получаю 3 результата назад. Один и тот же пост 3 раза, но с 1 тегом в каждом. Должен вернуться 1 пост с 3 тегами. Проблема заключается в запросе тегов выше.

1 Ответ

3 голосов
/ 17 октября 2010

Это потому, что вы присоединяетесь к Blog_TagToPostConnections во внешнем выражении.Поскольку есть три совпадающих тега, объединение будет производить три результата.Переместите объединение в выражение, назначаемое для Tags (вот где вы хотите три вещи, которые должны появиться).

from data in dataContext.Blog_BlogPosts
    where data.Slug == "asp-programmering"
    select new BlogPost
    {
        Title = data.Title,
        Slug = data.Slug,
        Author = data.Author,
        Text = data.Text,
        Tags = (from tags in dataContext.Blog_Tags
                join tagsData in dataContext.Blog_TagToPostConnections
                     on tags.TagID equals tagsData.TagID
                where data.BlogPostID == tagsData.BlogPostID
                select new Tag { TagID = tags.TagID, TagName = tags.Tag }
               ).ToList()
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...