2009-08-13 7 views
0

J'essaie d'obtenir une liste de balises distincte pour un enregistrement. Cela fonctionne en quelque sorte, sauf que le nom du tag est toujours le premier répété.Requête de jointure distincte LINQ

public EntityCollection<TagEntity> Tags 
    { 
     get 
     { 
      EntityCollection<TagEntity> x = new EntityCollection<TagEntity>() 
      { 
       new TagEntity(){Id=1, IsActive=true, Name="Tag1"}, 
       new TagEntity(){Id=2, IsActive=true, Name="Tag2"}, 
       new TagEntity(){Id=3, IsActive=true, Name="Tag3"}, 
       new TagEntity(){Id=4, IsActive=true, Name="Tag1"}, 
       new TagEntity(){Id=5, IsActive=true, Name="Tag5"}, 
       new TagEntity(){Id=6, IsActive=true, Name="Tag6"}, 
      }; 

      return x; 
     } 
    } 

    public EntityCollection<StoryTagsEntity> StoryTags 
    { 
     get 
     { 
      EntityCollection<StoryTagsEntity> x = new EntityCollection<StoryTagsEntity>() 
      { 
       new StoryTagsEntity(){ TagId=1, StoryId=1}, 
       new StoryTagsEntity(){ TagId=1, StoryId=2}, 
       new StoryTagsEntity(){ TagId=2, StoryId=1}, 
       new StoryTagsEntity(){ TagId=3, StoryId=1}, 
       new StoryTagsEntity(){ TagId=2, StoryId=3}, 
       new StoryTagsEntity(){ TagId=4, StoryId=1}, 
      }; 

      return x; 
     } 
    } 

    public List<string> FetchTagNamesByStory(bool? isActive, int StoryId) 
    { 
     var d = (from t in this.Tags 
       join st in this.StoryTags on t.Id equals st.StoryId 
       where t.IsActive == isActive.GetValueOrDefault() && st.StoryId == StoryId 
       select t.Name); 

     List<string> x = new List<string>(); 

     foreach (var item in d) 
     { 
      x.Add(item); 
     } 

     return x; 
    } 

Quels sont les résultats dans une liste des balises comme ceci:

Tag1, Tag1, Tag1, Tag1

Où cela devrait être:

Tag 1, Tag2, Tag3, Tag1

Des idées?

+0

le paramètre StoryId doit être storyId pour une meilleure lisibilité. –

+0

Je viens du monde VB.NET et pour une raison quelconque, StoryId est plus facile à lire pour moi que storyId. C'est juste une habitude. –

Répondre

0

Vous rejoignez t.Id à st.StoryId au lieu de st.TagId. Si vous passez en StoryId sur 1, vous aurez toujours Tag1.

0

Vous avez raison, la jointure est mauvaise, vous pouvez également effectuer les opérations suivantes:

public List<string> FetchTagNamesByStory(bool? isActive, int storyId) 
{ 
    return (from t in Tags 
     join st in StoryTags on t.Id equals st.TagId 
     where t.IsActive == isActive.GetValueOrDefault() && st.StoryId == storyId 
     select t.Name).ToList(); 
} 
Questions connexes