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 № 1Aby 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ł
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