CARREGAR DE MANEIRA R?PIDA A CLASSE POO

MAXCIM 02/12/2016 18:36:05
#469378
olá amigos,

como faço para ler a tabela na base de dados e carregar a classe de maneira rapida?

anteriormente eu lia a tabela e passava o datatable pro datagridview. ( carregava de modo instantâneo).

agora, seguindo as orientações do kerplunk e passando tudo para POO me surgiu um problema... ( a leitura é feita linha a linha , campo a campo)

e isso esta gerando uma perda de performance considerável.


uso mysql e conector Mysql.NET

desde já agradeço

KERPLUNK 02/12/2016 22:35:19
#469380
Resposta escolhida
São quantos registros? Quantos campos?
Aqueles vídeos, são aprendizado apenas e apesar de ser possível usar em um ambiente de produção, existem alternativas muito melhores, como o Entity Framework.
MAXCIM 03/12/2016 21:36:41
#469396
olá,kerplunk.

uma das consultas tem 65 campos e o numero de registros depende do filtro do usuário, media de 1000 a 5000 linhas podendo chegar a 30 mil.
isso pode aumentar exponencialmente com uma visão de matriz e filiais.

gostaria de passar todas essa consultas para POO, ( hoje uso select e passo o datatable para o datagridview) isso é bem rápido, mas toda visão de dados da linha tenho que ler o row da datagridview.

não usei ainda o Entity Framework, pesquisei um pouco e vi que ele é ligado diretamente na base de dados. ( como faria para passar o conection por parametros?)
vc tem vídeo ou material sobre o Entity Framework?


a principio, ha um modo de carregamento rápido, mantendo a estrutura que passou na vídeo-aula de POO?

desde já agradeço.
KERPLUNK 03/12/2016 21:50:57
#469397
Convenhamos que 30 mil linhas é um bocado de coisa. Uma alternativa é usar paginação de dados. Infelizmente só tenho um vídeo onde faço de maneira rápida utilizando o Entity Framework. A connection string, fica no app.config ou web.config, dependendo do tipo de projeto e pode tranquilamente ser alterada. A maneira como o Entity Framework funciona internamente é bem semelhante ao que uso nos vídeos, obviamente, o EF tem muito mais recursos.

Como 1000 ou 5000 ou 30 mil registros é sempre muita coisa para um usuário ver, é possível fazer uma técnica de Lazy Loading, onde fazemos o carregamento dos objeto conforme são vistos. é meio complexo, mas totalmente possível. Carregamos coisa de 20 ou 30 registros de forma integral(com todos os dados), os demais, apenas o ID do objeto é carregado e conforme o grid é rolado, o objeto é carregado individualmente, de acordo com seu ID.
MAXCIM 03/12/2016 22:02:57
#469400
obrigado, kerplunk, vou estudar a respeito.

se eu conseguir passar para o EF a conection por parametros seria melhor. ( ou gostaria de uma orientação de como tratar este cenário)
a matriz enxerga as vendas de todas as filiais ( por isso o numero elevando de linhas) passo para as classes o conection de cada unidade unidade e vou add ao list e depois atribuo ao datagridview.
essa visão se faz necessária para identificar estoques, disponibilidades e start de produção.

a aplicação é descktop e ja implementei uma paginação, mas os usuários sempre deixa na seleção ( exibir todos) e prefere a barra de rolagem).
EPISCOPAL 03/12/2016 23:21:40
#469401
Citação:

Carregamos coisa de 20 ou 30 registros de forma integral(com todos os dados), os demais, apenas o ID do objeto é carregado e conforme o grid é rolado, o objeto é carregado individualmente, de acordo com seu ID



Isso resolve o meu problema ...
KERPLUNK 04/12/2016 01:04:47
#469402
Citação:

Isso resolve o meu problema ...


Muito simples. Além das propriedades [Ô]IsNew[Ô] e [Ô]IsModified[Ô], coloque também uma propriedade [Ô]IsLoaded[Ô] com tipo booleano. Quando carregar somente o código(carregamento parcial), coloque essa propriedade como false(obviamente, as que estiverem carregadas completamente, coloque como true). Então você vai carregando os ítens conforme o datagridview é rolado.
MAXCIM 07/12/2016 12:17:40
#469470
encontrei esse código,
                  [ô]If we have results, convert to a list
If reader IsNot Nothing Then
[ô]Load the reader into a datatable
Dim dt As New System.Data.DataTable()
dt.Load(reader)
[ô]Populate a list
Dim results = dt.AsEnumerable().ToList()



ele listou mais de 4 mil registros com 104 colunas em menos de 1 segundo...

teria como passar esse dt.AsEnumerable para a classe?

segue imagens


ELUCIMAR 07/12/2016 13:54:17
#469476
MAXCIM

Vou te dar dois exemplos de como você pode fazer isso:

1º - Suponhamos que você tenha uma classe que contenha todos campos do DataTable
Classe:
public class ParametrosRelatorio
{
public int NumRelatorio { get; set; }
public string NomeRelatorio { get; set; }
}
Exemplo:
List<ParametrosRelatorio> lstParametrosRelatorio1 =
dtb.AsEnumerable().Select(l => new ParametrosRelatorio {
NumRelatorio = l.Field<int>([Ô]NumRelatorio[Ô]),
NomeRelatorio = l.Field<string>([Ô]NomeRelatorio[Ô])
}).ToList();


2º - Caso você não tenha uma classe que contenha todos campos do DataTable você poderia retorna uma lista de object anonymous
Exemplo:
var lstParametrosRelatorio2 =
dtb.AsEnumerable().Select(l => new {
NumRelatorio = l.Field<int>([Ô]NumRelatorio[Ô]),
NomeRelatorio = l.Field<string>([Ô]NomeRelatorio[Ô])
}).ToList();
Tópico encerrado , respostas não são mais permitidas