Pregunta

Aquí estoy tratando de hacer unos pocos izquierda se une en una consulta LINQ, pero me gustaría decir que en vez tengo idea de cómo materializar esta idea.

Básicamente aquí es las 3 estructuras de bases de datos que desea jugar.

<tags>
id | name

<events_tags>
tag_id | event_id

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

Así que para cada evento hay una relación de uno a muchos con las etiquetas, a continuación, un evento puede tener una o más etiquetas.

Me gustaría saber cómo buscar un evento basado en una etiqueta o cómo puedo, en base de una identificación del acontecimiento conocer las etiquetas asociadas?

¿Fue útil?

Solución

Para buscar por etiqueta caso, creo que se puede escribir algo como:

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;

Para obtener las etiquetas para un evento:

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

En este último caso, por conveniencia, se puede poner en una propiedad de eventos:

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

Y sólo se refieren a myEvent.Tags cuando los necesita.

Otros consejos

¿Usted está queriendo hacer muchos a muchos se unen aquí, se ve de esa manera .... LINQ to SQL no admite esta ... aquí es un gran artículo

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

Y éste de Scott Guthrie es útil para llegar a familiarizarse con los conceptos básicos

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

esperanza que ayuda

Para encontrar los nombres de eventos para un nombre de etiqueta especificada, usted podría hacer esto:

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

Del mismo modo, se puede buscar etiquetas con un nombre de evento específico como esto:

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

Observe cómo empecé con la tabla de unión, se unió y se filtra en la mesa con el valor conocido, y luego se unió a la mesa con los valores buscaron.

Joe

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top