【问题标题】:LINQ distinct join queryLINQ 不同的连接查询
【发布时间】:2009-08-13 13:39:40
【问题描述】:

我正在尝试为记录获取不同的标签列表。除了标签名称总是第一个重复之外,它有点工作。

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

有什么想法吗?

【问题讨论】:

  • StoryId 参数应该是 storyId 以获得更好的可读性。
  • 我来自 VB.NET 世界,出于某种原因,StoryId 比 storyId 更容易阅读。这只是一种习惯。

标签: linq


【解决方案1】:

您将加入t.Idst.StoryId 而不是st.TagId。如果你传入StoryId of 1,你总是会得到 Tag1。

【讨论】:

    【解决方案2】:

    你是对的,你的加入是错误的,你也可以这样做:

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

    【讨论】:

      猜你喜欢
      • 2015-09-13
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多