2010-01-23 4 views
0

J'ai la mise en place suivante.Subsonic 3.0 et tables « Link »

BlogPosts BlogToCategory Catégorie

Un blog post peut avoir beaucoup categorys et une catégorie peut être dans de nombreux messages de blog. .. (D'où la table intermédiaire

Comment puis-je obtenir une liste de tous les articles du blog dans une catégorie

J'ai essayé cela, mais cant semblent bien faire les choses (je reçois un IQueryable - > IEnumerable cast erreur)

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

} 

Ok comme ci-dessous, je l'ai essayé ce qui suit.

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; 

maintenant, c'est étrange, il semble la jointure ne va pas que chaque fois qu'il ya des données dans la Li nks table (Tablethat lie la catégorie au blog) il retourne TOUS les blogs.

a également essayé le ci-dessous.

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>(); 

Generated SQL

SELECT [dbo]. [Subtext_Links]. [LinkID], [dbo]. [Subtext_Links]. [Titre], [dbo]. [Subtext_Links]. [URL], [dbo]. [Subtext_Links]. [Rss], [dbo]. [Subtext_Links]. [Actif], [dbo]. [Subtext_Links]. [ID catégorie], [dbo]. [Subtext_Links ]. [blogid], [DBO]. [subtext_Links]. [PostID], [DBO]. [subtext_Links]. [NewWindow], [DBO]. [ subtext_Links]. [Rel], \ r \ n [dbo]. [subtext_Content]. [ID], [dbo]. [subtext_Content]. [Titre], [dbo]. [subtext_Content]. [DateAdded], [dbo]. [subtext_Content]. [PostType], [dbo]. [subtext_Content]. [Auteur], [dbo]. [subtext_Content]. [Email], [dbo]. [subtext_Content]. [blogid ], [ [dbo]. [Subtext_Content]. [Description], [dbo]. [Subtext_Content]. [DateUpdated], [dbo]. [Subtext_Content]. [Texte], [dbo]. [Subtext_Content]. [FeedBackCount], [DBO]. [subtext_Content]. [PostConfig], [DBO]. [subtext_Content]. [NomEntrée], [DBO]. [subtext_Content]. [DateSyndicated] \ r \ n FROM [dbo]. [Subtext_Links] \ r \ n INNER JOIN [dbo]. [Subtext_Content] ON [dbo]. [Subtext_Links]. [BlogId] = [dbo]. [Subtext_Content]. [BlogId] \ r \ n OÙ [dbo] [subtext_Links] [CategoryID] = @ 0"

+0

Qu'est-ce que SQL est en cours de génération? –

+0

@Adam - Mise à jour du message principal avec SQL. – LiamB

+0

Le @ 0 est un paramètre et non une valeur. Il est pratiquement impossible de lire le sql dans ce format, mais il ne semble pas que ce soit forcément faux. Cela donne-t-il les résultats attendus lorsque vous exécutez ce SQL? –

Répondre

1

Vous devez joindre les tables BlotToCategory et 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

Merci - je pensais que, il n'y a pas une solution plus élégante? – LiamB

+0

En fait, vous pouvez le réduire à une seule jointure, j'ai modifié ma réponse pour simplifier la requête –

+0

Voir la question J'ai fait une mise à jour – LiamB

0

J'ai essayé mais cant semblent bien faire les choses (je reçois un IQueryable - erreur de casting> IEnumerable)

Qu'en est-il en utilisant la méthode .ToList()?

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

+0

Il n'existe pas dans ce cas. Lors de l'utilisation de LinqToSql c'est facile comme ça mais avec subsonic c'est pas là ... – LiamB

0

Oui, il y a une façon plus élégante. Si vous utilisez les modèles ActiveRecord, et la catégorie et les tables Blogpost ont une relation de clé étrangère à la table BlogToCategory alors votre produit catégorie et les classes Blogpost auront chacun une propriété IQueryable représentant cette relation:

IQueryable<BlogToCategory> BlogToCategories {...} 

Qu'est-ce que vous want est une propriété

IQueryable<BlogPost> BlogPosts
sur votre classe Category. Créer une classe partielle pour la catégorie, et ajoutez la propriété 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; 
     } 
    } 

Maintenant, vous pouvez simplement appeler cat.BlogPosts.ToList() - la ToList() devrait être disponible, vous êtes sûr d'avoir inclus l'espace de noms contenant les méthodes d'extension?