代码之家  ›  专栏  ›  技术社区  ›  Erick

使用Linq联接查询

  •  0
  • Erick  · 技术社区  · 15 年前

    我在这里尝试将一些左联接加入到一个LINQ查询中,但我宁愿说我不知道如何实现这个想法。

    基本上,这里是我想使用的3个数据库结构。

    <tags>
    id | name
    
    <events_tags>
    tag_id | event_id
    
    <events>
    id | name | some-other-fields
    

    因此,对于每个事件,与标记之间都有一对多的关系,因此一个事件可以有一个或多个标记。

    我想知道如何根据标记搜索事件,或者如何根据事件ID了解相关标记?

    3 回复  |  直到 15 年前
        1
  •  0
  •   Matt Sherman    15 年前

    要按标签搜索事件,我认为您可以编写如下内容:

    var tagsIds = from t in DataContext.Tags
                  where t.Name == "sometag"
                  select t.id;
    
    var eventsByTag = from et in DataContext.EventTags
                      where tagsIds.Contains(et.tag_id)
                      select et.Event;
    

    要获取事件的标记:

    var tagsByEvent = from et in myEvent.EventTags
                      select et.Tag;
    

    对于后者,为了方便起见,可以将其置于事件属性中:

    public List<Tag> Tags
    {
       get
       {
          List<Tag> tags = (from et in this.EventTags
                            select et.Tag).ToList();
          return tags;
       }
    }
    

    在你需要的地方可以参考我的标签。

        2
  •  1
  •   Stuart    15 年前

    你想在这里做很多对很多的事吗,看那边…… linq to sql不支持这个…这是一篇很好的文章

    http://blogs.msdn.com/mitsu/archive/2007/06/21/how-to-implement-a-many-to-many-relationship-using-linq-to-sql.aspx

    斯科特·古思里写的这篇文章对掌握基础知识很有用。

    http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx

    希望有所帮助

        3
  •  0
  •   Joe Mayo    15 年前

    要查找指定标记名的事件名,可以执行以下操作:

    Console.WriteLine("\nEvents tagged as .NET:\n");
    
    (from evtTag in ctx.EventsTags
     join tag in ctx.Tags on evtTag.TagID equals tag.ID
     where tag.Name == ".NET"
     join evt in ctx.Events on evtTag.EventID equals evt.ID
     select evt)
     .ToList()
     .ForEach(evt => Console.WriteLine(evt.Name));
    

    类似地,您可以搜索具有以下特定事件名称的标记:

    Console.WriteLine("\nTags for TechEd:\n");
    
    (from evtTag in ctx.EventsTags
     join evt in ctx.Events on evtTag.EventID equals evt.ID
     where evt.Name == "TechEd"
     join tag in ctx.Tags on evtTag.TagID equals tag.ID
     select tag)
     .ToList()
     .ForEach(tag => Console.WriteLine(tag.Name));
    

    请注意,我是如何从联接表开始的,使用已知值联接和筛选表,然后使用搜索到的值联接到表的。