2009-05-18 4 views
0

Я пытаюсь сделать несколько левых объединений в linq-запрос, но я бы сказал, что я не знаю, как материализовать эту идею.join query with linq

В принципе, здесь есть 3 структуры базы данных, с которыми я хочу играть.

<tags> 
id | name 

<events_tags> 
tag_id | event_id 

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

так для каждого события есть один-ко-многим с бирками, событие может затем иметь один или несколько тегов.

Я хотел бы знать, как искать событие на основе тега или как я могу, основываясь на идентификаторе события, знать связанные теги?

ответ

0

Для поиска события по тегу, я думаю, вы можете написать что-то вроде:

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; 

Для последнего, для удобства, вы можете поместить его в имущество для проведения мероприятий:

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

И просто обратитесь к myEvent.Tags, где они вам нужны.

+0

Ты был самым близким. Я просто сбросил event_tags db и сохранил только теги и добавил event_id как внешний ключ. Легче управлять таким образом. Не уверен, что это будет для производительности в дальнейшем. – Erick

1

Вы желая сделать многие ко многим присоединиться здесь, выглядит именно так .... Linq к SQL не поддерживает это ... здесь большая статья

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

И это один из Скотт Гатри полезно в получении справиться с основами

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

надежду, что помогает

+0

Спасибо за подсказку, помогли немного, я изменил свой db для более простого способа работы. – Erick

0

Чтобы найти имена событий для указанного имени тега, вы можете сделать это:

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

Уведомления как я начал с таблицы соединений, присоединился и отфильтрован в таблице с известным значением, а затем присоединился к таблице со значениями, которые искали.

Joe