One-to-one associação e filtragem em Linq
-
19-09-2019 - |
Pergunta
Vamos dizer que tenho duas tabelas (Address
e Phone
) em sql que têm um-para-um relacionamento. Eu criei o LINQ to SQL correspondente aulas e mudou a associação para OneToOne
Eu quero recuperar ambos os objetos, filtrando objeto filho. por exemplo eu tenho a seguinte consulta que funciona bem:
var n = db.Addresses.Where(t => t.Phone.Number == 100);
Existe alguma maneira eu posso fazer o seguinte trabalho:
var n = db.Addresses.Where(t => t.Phone == new Phone(100));
O construtor da classe Phone
acima inicializa a propriedade Number
. Como eu posso ver a consulta que é emitido contém uma cláusula que filtra a tabela Telefones por id (chave primária), mas a cláusula número não incluído.
Se eu definir Number
como chave primária no visual studio, então ele está incluído na cláusula onde, mas a busca ainda não retornar nada como o valor do parâmetro para id é 0. Mesmo se funcionou, não é uma solução, como Number
deve não ser uma chave primária.
Solução
O que você está pedindo não muito sentido. Se você deseja que o elemento telefone dado o endereço, você tem isso acessando a propriedade Address.Phone.
Você não pode inicializar um tipo e usar isso para projeto sobre como este é DLINQ, onde a consulta é traduzida para baixo para o DB. Você pode fazer isso em Linq para objetos, mas seria forçá-lo a enumerar a sua lista, que iria buscar todas as informações do banco de dados na memória, o que pode não ser bom para o desempenho ...
Não vejo o problema aqui? Você tem o endereço, uma busca trabalhar para ele, e você pode acessar a propriedade telefone acessando a propriedade de endereço.