/ / unirse a la consulta con linq - c #, linq, .net-3.5, c # -3.0, unir a la izquierda

unir consulta con linq - c #, linq, .net-3.5, c # -3.0, unir a la izquierda

Estoy tratando de hacer algunas combinaciones a la izquierda en una consulta de linq, pero diría que prefiero no tener idea de cómo materializar esta idea.

Básicamente, aquí están las 3 estructuras de base de datos con las que quiero jugar.

<tags>
id | name

<events_tags>
tag_id | event_id

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

por lo tanto, para cada evento hay una relación de uno a varios con las etiquetas, un evento puede tener una o más etiquetas.

¿Me gustaría saber cómo buscar un evento en función de una etiqueta o cómo puedo, a partir de un identificador de evento, conocer las etiquetas asociadas?

Respuestas

0 para la respuesta № 1

Para buscar eventos por etiqueta, creo que puedes 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 de un evento:

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

Para este último, por conveniencia, puede ponerlo 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 solo remítase a myEvent.Tags donde los necesite.


1 para la respuesta № 2

¿Estás deseando hacer muchos para unirte aquí, se ve de esa manera ... Linq to sql no admite esto ... aquí hay 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 este de Scott Guthrie es útil para familiarizarse con lo básico.

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

Espero que ayude


0 para la respuesta № 3

Para encontrar los nombres de eventos para un nombre de etiqueta específico, puede 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, puede buscar etiquetas con un nombre de evento específico como este:

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 comencé con la tabla de unión, me uní y filtré en la tabla con el valor conocido y luego me uní a la tabla con los valores buscados.

Joe