consulta de combinación con LINQ
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?
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
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