Mostrando postagens com marcador dotnet. Mostrar todas as postagens
Mostrando postagens com marcador dotnet. Mostrar todas as postagens

quinta-feira, abril 19, 2007

A mágica do DetachedCriteria

NHibernate é bom mesmo.

Eu tinha o seguinte código hoje pra otimizar (extraído de um Controller do projeto que estou trabalhando):

[Layout("popup")]
public void Observacoes([ARFetch] Pedido pedido, [ARFetch] Fornecedor fornecedor)
{
SimpleQuery consulta;

if (fornecedor == null) {
consulta = new SimpleQuery(@"
from ObservacaoPedido obs
where obs.Pedido = ?
order by obs.CriacaoData
", pedido);
}
else {
consulta = new SimpleQuery(@"
from ObservacaoPedido obs
where obs.Pedido = ? and obs.Fornecedor = ?
order by obs.CriacaoData
", pedido, fornecedor);
}

IEnumerable observacoes = consulta.Execute();

PropertyBag.Add("pedido", pedido);
PropertyBag.Add("fornecedor", fornecedor);
PropertyBag.Add("observacoes", observacoes);
}


Qual era o problema dele? A princípio, nenhum... Mas o NHibernate tem uma certa particularidade: quando o carregamento de objetos veio de uma consulta HQL, ele não cria proxies para os objetos (ou seja, sem lazy-loading para relacionamentos muitos-para-um), e só carrega exatamente o que diz minha consulta. O resultado é um turbilhão de consultas sendo enviadas ao banco, para carregar os dados que "faltaram"... Mesmo que eu não use eles.

Introduzindo, então, o DetachedCriteria:

public void Observacoes([ARFetch] Pedido pedido, [ARFetch] Fornecedor fornecedor) {
QueryBuilder q =
Where.ObservacaoPedido.Pedido == pedido;

DetachedCriteria crit = q;
crit.SetResultTransformer(new DistinctRootEntityResultTransformer());
crit.SetFetchMode("Anexos", FetchMode.Eager);
crit.SetFetchMode("Anexos.Arquivo", FetchMode.Eager);

IEnumerable observacoes =
ObservacaoPedido.List(crit, OrderBy.ObservacaoPedido.CriacaoData);

PropertyBag.Add("pedido", pedido);
PropertyBag.Add("fornecedor", fornecedor);
PropertyBag.Add("observacoes", observacoes);
}


O código, menor, ficou até um pouco mais claro, apesar de ter ficado mais arcano, expondo mais o NHibernate. Teria ficado mais ainda, se eu não tivesse utilizado o NHQG do Ayende para gerar o DetachedCriteria.

O resultado? Apenas uma consulta sendo enviada ao banco, e o tempo de carregamento de uma tela baixou de 3s pra 0,4s.

quarta-feira, julho 05, 2006

Bug nos Generics do .NET 2.0

Passei as últimas 6h procurando pela causa de um maldito BadImageFormatException, lançado pelo .NET quando carregava um Assembly (DLL) meu.

Após muita depuração, pesquisa no Google, uma barra de chocolate Alpino e meio litro de Coca-Cola Light Lemon, finalmente encontrei o problema. Acabei reservando meus 15 minutos seguintes de insônia para isolar o problema e escrever um breve código para quem quiser reproduzí-lo.

Acho que pouca gente vai tentar fazer um uso tão obscuro de Generics do .NET 2.0... Mas, em todo caso, segue o link: http://fabio.pastebin.com/740463

sexta-feira, junho 09, 2006

.NET Framework 3.0

Nada mais de WinFX: o nome oficial da tecnologia de desenvolvimento que virá com o Windows Vista agora é .NET Framework 3.0 mesmo.

Muito bom, a meu ver. WinFX é invenção do pessoal de marketing, mas, no fim das contas, não passa disso: novas classes pro runtime do .NET.

Se continuar a onda de sinceridade, daqui a pouco vão assumir que o Windows Vista na verdade não passa de um Windows 98 TE (Third Edition).