Estou tendo problemas com uma consulta escrita em LINQ e Lambda. Até agora, estou recebendo muitos erros, eis o meu código:
int id = 1;
var query = database.Posts.Join(database.Post_Metas,
post => database.Posts.Where(x => x.ID == id),
meta => database.Post_Metas.Where(x => x.Post_ID == id),
(post, meta) => new { Post = post, Meta = meta });
Sou iniciante no uso do LINQ, portanto, não tenho certeza se esta consulta está correta.
Respostas:
Acho que se você estiver familiarizado com a sintaxe SQL, o uso da sintaxe de consulta LINQ é muito mais clara, mais natural e facilita a identificação de erros:
No entanto, se você realmente está preso ao uso de lambdas, sua sintaxe está um pouco diferente. Aqui está a mesma consulta, usando os métodos de extensão LINQ:
fonte
lambda
e é citar fácil de usar e entenderVocê poderia seguir dois caminhos com isso. Usando o LINQPad (inestimável se você é novo no LINQ) e um banco de dados fictício, criei as seguintes consultas:
ou
Nesse caso em particular, acho que a sintaxe do LINQ é mais limpa (alterno entre os dois, dependendo do que é mais fácil de ler).
O que eu gostaria de salientar é que, se você possui chaves estrangeiras apropriadas em seu banco de dados (entre post e post_meta), provavelmente não precisará de uma associação explícita, a menos que esteja tentando carregar um grande número de registros . Seu exemplo parece indicar que você está tentando carregar uma única postagem e seus metadados. Supondo que haja muitos registros post_meta para cada postagem, você pode fazer o seguinte:
Se você deseja evitar o problema n + 1, pode dizer explicitamente ao LINQ to SQL para carregar todos os itens relacionados de uma só vez (embora esse possa ser um tópico avançado para quando você estiver mais familiarizado com o L2S). O exemplo abaixo diz "quando você carrega uma postagem, também carrega todos os seus registros associados a ela por meio da chave estrangeira representada pela propriedade 'Post_metas'":
É possível fazer várias
LoadWith
chamadas em um único conjuntoDataLoadOptions
para o mesmo tipo ou vários tipos diferentes. Se você fizer isso muito, porém, considere apenas o cache.fonte
Daniel tem uma boa explicação dos relacionamentos de sintaxe, mas eu juntei este documento para minha equipe, a fim de torná-lo um pouco mais simples para eles entenderem. Espero que isso ajude alguém
fonte
Post_ID
campo no segundo aliasmeta => meta.Post_ID
. No exemplo desta ilustração, ag.id
parte da instrução select originalJOIN gStatus g on g.id
não é replicada na expressão final do Lambda.public class IdHolder{ int id }
, usaria esse objeto no gStatusList<IdHolder> gStatus = new List<IdHolder>(); gStatus.add(new IdHolder(){id = 7}); gStatus.add(new IdHolder(){id = 8});
, ele teria mudado o Linq parat =>t.value.TaskStatusId, g=>g.id
que essa mudança faça sentido?Seus seletores de teclas estão incorretos. Eles devem pegar um objeto do tipo da tabela em questão e retornar a chave a ser usada na associação. Eu acho que você quer dizer isso:
Você pode aplicar a cláusula where posteriormente, não como parte do seletor de teclas.
fonte
Postagem porque quando iniciei o LINQ + EntityFramework, observei esses exemplos por um dia.
Se você estiver usando o EntityFramework e tiver uma propriedade de navegação nomeada
Meta
naPost
configuração do objeto de modelo, isso é muito fácil. Se você estiver usando entidade e não tiver essa propriedade de navegação, o que está esperando?Se você estiver criando o código primeiro, configure a propriedade da seguinte maneira:
fonte
Eu fiz algo assim;
fonte
Pode ser algo como
fonte
1 é igual a 1 duas junções de tabela diferentes
fonte
Esta consulta linq deve funcionar para você. Ele receberá todas as postagens que possuem meta meta.
Consulta SQL equivalente
fonte