Pergunta

Eu estou tentando aqui para fazer algumas esquerda junta-se em uma consulta linq mas eu diria que prefiro não têm idéia de como materializar essa idéia.

Basicamente aqui é as 3 estruturas de banco de dados que eu quero jogar.

<tags>
id | name

<events_tags>
tag_id | event_id

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

então para cada eventos há uma relação de um-para-muitos com marcas, um evento pode ter um ou mais tags.

Eu gostaria de saber como procurar um evento baseado em uma marca ou como posso, com base a partir de um ID de evento de saber as marcas associadas?

Foi útil?

Solução

Para procurar eventos por tag, eu acho que você pode escrever algo como:

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;

Para obter as etiquetas para um evento:

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

Para este último, por conveniência, você pode colocá-lo em uma propriedade de eventos:

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

E apenas se referem a myEvent.Tags onde você precisar deles.

Outras dicas

Você está querendo fazer muitos para muitos juntar-se aqui, parece que maneira .... LINQ to SQL não suporta esta ... aqui é um ótimo artigo

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

E este de Scott Guthrie é útil para chegar ao confronto com o básico

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

esperança que ajuda

Para encontrar os nomes de evento para um nome de marca especificada, você poderia fazer isso:

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

Da mesma forma, você pode procurar por marcas com um nome de evento específico como este:

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

Observe como eu comecei com a junção da tabela, juntou-se e filtrados na tabela com o valor conhecido, e, em seguida, juntou-se à mesa com os valores de procura.

Joe

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top