0

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

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

<tags>
id | name

<events_tags>
tag_id | event_id

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

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

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

4

3 回答 3

1

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

希望有帮助

于 2009-05-19T00:05:58.703 回答
0

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

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 即可。

于 2009-05-19T00:23:26.157 回答
0

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

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

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

于 2009-05-19T00:59:51.810 回答