2009-05-18 7 views
0

J'essaye ici de faire quelques jointures à gauche dans une requête linq mais je dirais que je ne sais pas comment concrétiser cette idée.rejoindre la requête avec linq

Fondamentalement, voici les 3 structures de base de données que je veux jouer avec.

<tags> 
id | name 

<events_tags> 
tag_id | event_id 

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

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

J'aimerais savoir comment rechercher un événement en fonction d'une balise ou comment puis-je, à partir d'un ID d'événement, connaître les balises associées?

Répondre

0

Pour rechercher l'événement par tag, 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 juste se référer à myEvent.Tags où vous en avez besoin.

+0

Vous étiez le plus proche. Je viens de supprimer la base de données events_tags et j'ai gardé seulement les tags et j'ai ajouté event_id comme clé étrangère. Plus facile à gérer de cette façon. Je ne sais pas ce que ce sera pour la performance plus tard. – Erick

1

Ê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-to-sql.aspx

Et ce celui de Scott Guthrie est utile pour obtenir familiariser avec les bases

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

espoir qui aide

+0

Merci pour le conseil, aidé un peu, j'ai modifié mon db pour plus de facilité à travailler. – Erick

0

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

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

Avis comment j'ai commencé avec la table de jointure, joint et filtré sur la table avec la valeur connue, puis joint à la table avec les valeurs recherchées.

Joe