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.

Foi útil?

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

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