Quer um resultado fortemente escritos a partir do JOIN no .netTiers
-
07-07-2019 - |
Pergunta
Dada uma consulta como:
SELECT table1.field1 FirstField, table2.field2 SecondField
FROM table1
INNER JOIN table2 ON table1.FK = table2.PK
WHERE table1.somefield = 'somevalue';
Meu objetivo é retornar um conjunto de resultados fortemente tipado usando .netTiers. Eu suponho que eu não posso usar uma exibição porque a cláusula WHERE
precisa de um parâmetro, que não pode ser passado para uma vista. Um procedimento armazenado pode ser passado o parâmetro 'somevalue', mas retorna um DataSet
ou DataReader
fracamente tipado.
Eu acho que eu apenas estou faltando um conceito aqui. Só para ficar claro, o que eu gostaria de acabar com é ser capaz de escrever algo como isto:
TList <some-entity-name> entityList = DataRepository.SomeProvider.Get( "somevalue" );
foreach ( some-entity-name entity in entityList ) {
DoSomethingWith( entity.FirstField, entity.SecondField );
}
Eu gostaria de evitar uma solução que envolve um filtro do lado do servidor após a consulta foi executada; as tabelas envolvidas são muito grandes.
Solução
Criar uma vista e usar o objeto ParameterBuilder fortemente tipado para filtrar a exibição na coluna específica. Eu não consigo lembrar o que a camada este objeto está.
Isto é como você iria utilizá-lo:
MyViewParameterBuilder builder = new MyViewParameterBuilder();
builder.AppendEquals(TableColumn.Column, "value");
DataRepository.MyViewEntityProvider.Find(builder.GetParameters());
Posso estar errado, mas eu não acredito net-tiers realmente 'filtros' o objeto TList / Vlist com o método acima, que é o que o nome do objeto poderia sugerir. O construtor gera lá onde cláusula e nettiers executa uma consulta contra o banco de dados utilizando esta cláusula.
A sua 2ª opção é tentar gerar um procedimento armazenado, mas somente se o conjunto de resultados da sua proc armazenado corresponde ao esquema de uma das tabelas no seu banco de dados. Caso contrário, net-tiers não vai saber como gerar contra ele. Você pode ler mais sobre isso aqui
Outras dicas
Se você quiser uma coleção TList com uma junção que você precisa para criar um procedimento armazenado personalizado. Solução aqui: http://benpowell.org/ paginação-and-ordenação-em-processo a-nettiers-armazenado personalizado /
Se você tem cenário como este:
- Conta (PK AccountId)
- Cliente (PK ClientId)
- ClientAccount (PK ClientId, AccountId)
Enquanto você tem a configuração de chaves estrangeiras correta, .NetTiers irá fornecer-lhe o método apropriado:
AccountService s = new AccountService();
TList<Account> accountCollection = s.GetByClientIdFromClientAccount(1);
Há também um método sobrecarregado gerado que suportes de paginação (infelizmente não cláusula orderBy).