join query con linq
Domanda
Sto cercando di fare un paio di sinistra, si unisce una query linq, ma dico io invece non hanno idea di come materializzare questa idea.
In fondo qui è il 3 strutture di database voglio giocare con.
<tags>
id | name
<events_tags>
tag_id | event_id
<events>
id | name | some-other-fields
così, per ogni evento c'è un uno-a-molti relazione con i tag, un evento può quindi disporre di uno o più tag.
Mi piacerebbe sapere come la ricerca di un evento basato su un tag o come è possibile, in base a un evento id conoscere i tag associati ?
Soluzione
Per cercare eventi per tag, penso che si può scrivere qualcosa di simile:
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;
Per ottenere i tag per un evento:
var tagsByEvent = from et in myEvent.EventTags
select et.Tag;
Per questi ultimi, per comodità, si può mettere in una proprietà di eventi:
public List<Tag> Tags
{
get
{
List<Tag> tags = (from et in this.EventTags
select et.Tag).ToList();
return tags;
}
}
E proprio riferirsi a myEvent.Tags dove ne avete bisogno.
Altri suggerimenti
Si vogliono fare molti-a-molti entrare qui, si guarda in quel modo....Linq to sql non supporta questo...qui è un grande articolo
E questo da Scott Guthrie è utile nel fare i conti con le basi
http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx
speranza che aiuta
Per trovare i nomi di evento per un nome tag specificato, si potrebbe fare questo:
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));
Allo stesso modo, è possibile cercare i tag con un nome specifico evento come questo:
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));
Si noti come ho iniziato con il tavolo unire, unito e filtrata sul tavolo con il valore noto, e poi unito al tavolo con i valori cercato.
Joe