Я пытаюсь получить отдельный список тегов для записи. Это работает, за исключением того, что имя тега всегда повторяется первым.

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, Тег1, Тег1, Тег1

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

Тег 1, тег2, тег3, тег1

Любые идеи?

0
William Hurst 13 Авг 2009 в 17:39
Параметр StoryId должен быть storyId для лучшей читабельности.
 – 
Yuriy Faktorovich
13 Авг 2009 в 17:59
Я пришел из мира VB.NET, и по какой-то причине StoryId мне легче читать, чем storyId. Это просто привычка.
 – 
William Hurst
14 Авг 2009 в 12:05

2 ответа

Вы присоединяетесь к t.Id в st.StoryId вместо st.TagId. Если вы сдадите StoryId из 1, вы всегда получите Tag1.

0
dahlbyk 13 Авг 2009 в 17:48

Вы правы, ваше соединение было неправильным, также вы можете сделать следующее:

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();
}
0
Yuriy Faktorovich 13 Авг 2009 в 18:10