Question

Je suis en train ici pour faire quelques gauche rejoint dans une requête LINQ mais je dirais que j'ai plutôt aucune idée de comment concrétiser cette idée.

En gros voici les 3 structures de base de données que je veux jouer.

<tags>
id | name

<events_tags>
tag_id | event_id

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

pour chaque événement il y a un à-plusieurs avec des balises, un événement peut alors avoir une ou plusieurs balises.

Je voudrais savoir comment rechercher un événement basé sur une étiquette ou comment puis-je, sur la base d'un ID d'événement connaître les balises associées?

Était-ce utile?

La solution

Pour effectuer une recherche par tag événement, je pense que vous pouvez écrire quelque chose comme:

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;

Pour obtenir les tags pour un événement:

var tagsByEvent = from et in myEvent.EventTags
                  select et.Tag;

Pour ce dernier, pour la commodité, vous pouvez le mettre dans une propriété des événements:

public List<Tag> Tags
{
   get
   {
      List<Tag> tags = (from et in this.EventTags
                        select et.Tag).ToList();
      return tags;
   }
}

Et se référer à myEvent.Tags où vous en avez besoin.

Autres conseils

Êtes-vous envie de faire plusieurs à plusieurs rejoindre ici, semble cette façon .... LINQ to SQL ne supporte pas ... voici un article

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

Et celui-ci de Scott Guthrie est utile dans la prise en main avec les bases

http : //weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx

espoir qui aide

Pour trouver les noms d'événement pour un nom de balise spécifié, vous pouvez faire ceci:

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

De même, vous pouvez rechercher des balises avec un nom d'événement spécifique comme celui-ci:

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

Remarquez comment j'ai commencé avec la table de jointure, et rejoint Filtré sur la table avec la valeur connue, puis rejoint à la table avec les valeurs recherchées.

Joe

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top