2009-08-13 15 views
0

レコードのタグの別のリストを取得しようとしています。タグ名以外の作品は、常に最初の繰り返しです。LINQ distinct join query

タグ1、タグ1、タグ1、タグ1

それは次のようになります。このようなタグのリストになり

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; 
    } 

タグ1、 Tag2、Tag3、Tag1

アイデアはありますか?

+0

StoryIdパラメータは、読みやすくするためstoryIdする必要があります。 –

+0

私はVB.NETの世界から来て、何らかの理由でStoryIdがstoryIdより読みやすくなっています。それは単なる習慣です。 –

答えて

0

の代わりにt.Idst.StoryIdに参加しています。 StoryIdに1を渡すと、常にTag1が得られます。

0

また、あなたは次の操作を行うことができ、あなたの参加が間違っていた、正しいです:

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