Вопрос

Я пытаюсь здесь сделать несколько левых соединений в запросе 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://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

надеюсь, это поможет

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

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

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

Джо

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top