Subsonic 3.0 и "Link" таблицы - PullRequest
       11

Subsonic 3.0 и "Link" таблицы

0 голосов
/ 23 января 2010

У меня есть следующие настройки.

· блоги, · BlogToCategory Категория

В одном сообщении блога может быть много категорий, а категория может быть во многих сообщениях блога. (Отсюда и промежуточная таблица.

Как мне получить список всех постов в блоге в одной категории.

Я пробовал это, но, кажется, не могу понять это правильно (я получаю IQueryable -> IEnumerable ошибка приведения)

public IEnumerable<BlogPost> FetchAllBlogs(int? CatId)
{
        return from c in CategoryLink.All()
                   where c.CategoryID == CatId
                   select c.BlogPost;

}

Хорошо, как показано ниже, я попробовал следующее.

return from blogToCategories in subtext_Link.All()
                      join blogPosts in subtext_Content.All() on blogToCategories.BlogId equals blogPosts.BlogId
                      where blogToCategories.CategoryID == CatId
                      orderby (blogPosts.DateAdded) descending
                      select blogPosts;

Теперь это странно. Кажется, что соединение неверно, поскольку всякий раз, когда в таблице ссылок (таблица ссылок на блог) есть данные, он возвращает ВСЕ блоги.

Также попробовал следующее.

BlogList = new TransformDB().Select
                  .From<subtext_Content>()
                  .InnerJoin<subtext_Link>(subtext_LinksTable.BlogIdColumn, subtext_ContentTable.BlogIdColumn)
                  .Where(subtext_LinksTable.CategoryIDColumn).IsEqualTo(CatId)
                  .ExecuteTypedList<subtext_Content>();

Сгенерированный SQL

SELECT [dbo]. [Subtext_Links]. [LinkID], [DBO]. [Subtext_Links]. [Название], [DBO]. [Subtext_Links]. [URL], [DBO]. [Subtext_Links]. [RSS], [DBO]. [Subtext_Links]. [Активный], [DBO]. [Subtext_Links]. [CategoryID], [DBO]. [Subtext_Links]. [BlogId], [DBO]. [Subtext_Links]. [Сообщения дан], [DBO]. [Subtext_Links]. [NewWindow], [DBO]. [Subtext_Links]. [Rel], \ Г \ п [DBO]. [Subtext_Content]. [ID], [DBO]. [Subtext_Content]. [Название], [DBO]. [Subtext_Content]. [DateAdded], [DBO]. [Subtext_Content]. [PostType], [DBO]. [Subtext_Content]. [Автор], [DBO]. [Subtext_Content]. [Email] [DBO]. [Subtext_Content]. [BlogId], [DBO]. [Subtext_Content]. [Описание], [DBO]. [Subtext_Content]. [DateUpdated], [DBO]. [Subtext_Content]. [Текст], [DBO]. [Subtext_Content]. [FeedBackCount], [DBO]. [Subtext_Content]. [PostConfig], [DBO]. [Subtext_Content]. [EntryName], [DBO]. [Subtext_Content]. [DateSyndicated] \ г \ п ОТ [dbo]. [Subtext_Links] \ r \ n ВНУТРЕННИЙ ПРИСОЕДИНИТЬСЯ [dbo]. [Subtext_Content] ON [dbo]. [subtext_Links]. [BlogId] = [DBO]. [Subtext_Content]. [BlogId] \ г \ п ГДЕ [dbo]. [subtext_Links]. [CategoryID] = @ 0"

Ответы [ 3 ]

1 голос
/ 23 января 2010

Вам необходимо присоединиться к таблицам BlotToCategory и BlogPost:

public IEnumerable<BlogPost> FetchAllBlogs(int? CatId)
{
  return from blogToCategories in BlogToCategory.All() 
         join blogPosts in BlogPost.All() on blogPosts.Id equals blogToCategories.BlogId 
         where blogToCategories.CategoryID == CatId
         select blogPosts;

}
0 голосов
/ 27 января 2010

Да, есть более элегантный способ. Если вы используете шаблоны ActiveRecord, а таблицы Category и BlogPost имеют отношение внешнего ключа к таблице BlogToCategory, то каждый из созданных вами классов Category и BlogPost будет иметь свойство IQueryable, представляющее это отношение:

IQueryable<BlogToCategory> BlogToCategories {...}

То, что вы хотите - это свойство

IQueryable<BlogPost> BlogPosts
в вашем классе Category. Создайте частичный класс для категории и добавьте свойство IQueryable:
    public IQueryable<BlogPost> BlogPosts
    {
        get
        {
            var repo = BlogPost.GetRepo();
            return from items in repo.GetAll()
                   join linkItems in BlogToCategories 
                   on items.CatID equals linkItems.CategoryID
                   select items;
        }
    }

Теперь вы можете просто вызвать cat.BlogPosts.ToList () - ToList () должен быть доступен, вы уверены, что включили пространство имен, содержащее методы расширения?

0 голосов
/ 23 января 2010

Я пробовал это, но, кажется, не могу понять это правильно (я получаю IQueryable -> IEnumerable ошибка приведения)

А как насчет использования метода .ToList ()?

http://msdn.microsoft.com/en-us/library/bb342261.aspx

...