使用 linq 连接查询
题
我在这里尝试在 linq 查询中进行一些左连接,但我想说我不知道如何实现这个想法。
基本上这是我想要使用的 3 个数据库结构。
<tags>
id | name
<events_tags>
tag_id | event_id
<events>
id | name | some-other-fields
因此,对于每个事件,都与标签存在一对多关系,一个事件可以有一个或多个标签。
我想知道如何根据标签搜索事件,或者如何根据事件 ID 知道关联的标签?
解决方案
要通过标签搜索事件,我想你可以写这样的:
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;
}
}
和只是参考,你需要他们myEvent.Tags。
其他提示
您想在这里进行多对多加入吗,看起来是这样......Linq to sql 不支持这个...这是一篇很棒的文章
Scott Guthrie 的这篇文章对于掌握基础知识很有用
http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx
希望有帮助
要找到指定标签名称的事件名称,你可以这样做:
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));
注意我是如何开始使用连接表,连接并与已知的值过滤在桌子上,然后连接到表中的值被搜索的。
乔
不隶属于 StackOverflow