2009-08-13 3 views
0

Я пытаюсь получить отличный список тегов для записи. Это своего рода работы, за исключением того, что имя тега всегда является первым повторением.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; 
    } 

Какие результаты в виде списка тегов, как это:

Tag1, Tag1, Tag1, Tag1

Где, что должно быть:

Tag 1, Tag2, Tag3, Tag1

Любые идеи?

+0

в StoryId параметр должен быть storyId для лучшей читаемости. –

+0

Я родом из мира VB.NET, и по какой-то причине StoryId мне легче читать, чем storyId. Это просто привычка. –

ответ

0

Вы присоединяетесь к t.Id по номеру st.StoryId вместо st.TagId. Если вы пройдете 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(); 
}