Join-Abfrage mit Linq
Frage
ich hier versuchen, ein paar linke Abfrage verknüpft in eine Linq zu machen, aber ich würde sagen, dass ich lieber keine Ahnung, wie diese Idee zu verwirklichen.
Im Grunde ist hier die drei Datenbankstrukturen ich mit spielen will.
<tags>
id | name
<events_tags>
tag_id | event_id
<events>
id | name | some-other-fields
so für jeden Event gibt es eine Eins-zu-viele ist Beziehung mit Tags, kann ein Ereignis dann eine oder mehr Tags.
würde Ich mag wissen, wie ein Ereignis zu suchen, basierend auf einem Tag oder wie kann ich, basierend auf einem Ereignis-ID kennen die zugehörigen Tags?
Lösung
Veranstaltung von Tag zu suchen, ich glaube, Sie so etwas wie schreiben:
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;
Um die Tags für eine Veranstaltung zu erhalten:
var tagsByEvent = from et in myEvent.EventTags
select et.Tag;
Für letztere für die Bequemlichkeit, können Sie es in einer Eigenschaft von Event setzen:
public List<Tag> Tags
{
get
{
List<Tag> tags = (from et in this.EventTags
select et.Tag).ToList();
return tags;
}
}
Und beziehen sich nur auf myEvent.Tags, wo sie gebraucht werden.
Andere Tipps
Sind Sie wollen ein viel zu tun, um viele hier kommen, sieht so aus .... LINQ to SQL unterstützt dies nicht ... hier ist ein großer Artikel
Und dieser von Scott Guthrie ist nützlich bei der mit den Grundlagen in den Griff bekommen
http : //weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx
Hoffnung, die hilft
Um die Ereignisnamen für einen bestimmten Tag-Namen zu finden, könnten Sie dies tun:
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));
Ebenso können Sie für Tags mit einem bestimmten Ereignisnamen wie folgt suchen:
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));
Beachten Sie, wie ich mit der Join-Tabelle begonnen, verbunden und mit dem bekannten Wert auf dem Tisch gefiltert und dann an den Tisch trat mit den Werten gesucht.
Joe