объединить запрос с помощью linq
Вопрос
Я пытаюсь здесь сделать несколько левых соединений в запросе linq, но я бы сказал, что я скорее понятия не имею, как материализовать эту идею.
В принципе, вот 3 структуры базы данных, с которыми я хочу поиграть.
<tags>
id | name
<events_tags>
tag_id | event_id
<events>
id | name | some-other-fields
таким образом, для каждого события существует отношение "один ко многим" с тегами, тогда событие может иметь один или несколько тегов.
Я хотел бы знать, как выполнить поиск события по тегу или как я могу на основе идентификатора события узнать связанные теги?
Решение
Для поиска события по тегу, я думаю, вы можете написать что-то вроде:
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;
Чтобы получить теги для события:
var tagsByEvent = from et in myEvent.EventTags
select et.Tag;
Для последнего, для удобства, вы можете поместить его в свойство Events:
public List<Tag> Tags
{
get
{
List<Tag> tags = (from et in this.EventTags
select et.Tag).ToList();
return tags;
}
}
И просто обратитесь к MyEvent.Теги там, где они вам нужны.
Другие советы
Вы хотите присоединиться здесь ко многим, похоже, что так....Linq to sql не поддерживает это ... вот отличная статья
И эта статья от Скотта Гатри полезна для ознакомления с основами
http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx
надеюсь, это поможет
Чтобы найти имена событий для указанного имени тега, вы могли бы сделать это:
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));
Аналогичным образом, вы можете искать теги с определенным названием события следующим образом:
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));
Обратите внимание, как я начал с таблицы объединения, объединил и отфильтровал таблицу с известным значением, а затем присоединил к таблице с искомыми значениями.
Джо