/ / Join zapytanie za pomocą linq - c #, linq, .net-3.5, c # -3.0, lewy łączenie

łącz zapytanie z linq - c #, linq, .net-3.5, c # -3.0, łączenie lewe

Próbuję tutaj zrobić kilka lewych złączeń w zapytaniu linq, ale powiedziałbym, że raczej nie mam pojęcia, jak zrealizować ten pomysł.

Zasadniczo tutaj są 3 struktury baz danych, którymi chcę się bawić.

<tags>
id | name

<events_tags>
tag_id | event_id

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

więc dla każdego zdarzenia istnieje relacja jeden-do-wielu ze znacznikami, zdarzenie może wtedy mieć jeden lub więcej znaczników.

Chciałbym wiedzieć, jak wyszukać wydarzenie na podstawie tagu lub w jaki sposób, na podstawie identyfikatora zdarzenia, znać powiązane tagi?

Odpowiedzi:

0 dla odpowiedzi № 1

Aby wyszukać wydarzenie według tagu, myślę, że możesz napisać coś takiego:

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;

Aby uzyskać tagi zdarzenia:

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

W drugim przypadku, dla wygody, możesz umieścić go we właściwości Zdarzenia:

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

I po prostu zajrzyj do myEvent.Tags tam, gdzie ich potrzebujesz.


1 dla odpowiedzi nr 2

Czy chcesz dołączyć tutaj do wielu, wygląda tak ... Linq to sql nie obsługuje tego ... oto świetny artykuł

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

A ten od Scotta Guthrie jest przydatny w opanowaniu podstaw

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

mam nadzieję, że pomaga


0 dla odpowiedzi № 3

Aby znaleźć nazwy zdarzeń dla określonej nazwy znacznika, możesz to zrobić:

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

Podobnie możesz wyszukiwać tagi o określonej nazwie zdarzenia, takiej jak ta:

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

Zauważ, jak zacząłem od tabeli łączenia, połączyłem i przefiltrowałem tabelę o znanej wartości, a następnie dołączyłem do tabeli z szukanymi wartościami.

Joe