【问题标题】:join query with linq使用 linq 连接查询
【发布时间】:2010-10-27 04:36:18
【问题描述】:

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

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

<tags>
id | name

<events_tags>
tag_id | event_id

<events>
id | name | some-other-fields

所以对于每个事件来说,标签之间存在一对多的关系,那么一个事件可以有一个或多个标签。

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

【问题讨论】:

    标签: c# linq .net-3.5 c#-3.0 left-join


    【解决方案1】:

    要查找指定标签名称的事件名称,您可以这样做:

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

    请注意我是如何从连接表开始的,使用已知值对表进行连接和过滤,然后使用搜索到的值连接到表。

    【讨论】:

      【解决方案2】:

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

      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;
      

      对于后者,为了方便,你可以把它放在Events的一个属性中:

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

      只需在需要它们的地方引用 myEvent.Tags。

      【讨论】:

      • 你是最近的一个。我刚刚删除了 events_tags 数据库并只保留了标签并将 event_id 添加为外键。这种方式更容易管理。不知道以后的表现会怎样。
      【解决方案3】:

      你想在这里做多对多的加入吗,看起来那样...... 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

      Scott Guthrie 的这篇文章对于掌握基础知识很有用

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

      希望对你有帮助

      【讨论】:

      • 感谢您的提示,有点帮助,我修改了我的数据库以获得更简单的工作方式。
      猜你喜欢
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多