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 ?

È stato utile?

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

http://blogs.msdn.com/mitsu/archive/2007/06/21/how-to-implement-a-many-to-many-relationship-using-linq-to-sql.aspx

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top