.NET - NHibernate e ActiveRecord - Dúvida com Detached Criteria - Conversão de DateTime

1 resposta
T

Galera, eu tenho essa query no banco sql server:

select h.Tipo, h.Cartao, h.Data
from tblInnerHorarios h
where h.Tipo = '003' 
and h.Cartao like '%008'
and CONVERT(CHAR,h.Data, 103) = '04/11/2009'
order by h.Data desc

e tenho isso no detached criteria:

DateTime data = u.DtAntepenultimaEntrada.Value.Date; 
 DetachedCriteria cr = DetachedCriteria.For<Horario>();
 cr.Add(Expression.Eq("Tipo", "003"));
 cr.Add(Expression.Eq("Cartao", u.Cartao));

// tentei isso! Retorna null pq não acha nada no banco.
//cr.Add(Expression.Eq("DtAtual", data)); 

// tentei isso!
//cr.Add(Restrictions.Eq(Projections.SqlFunction("convert(char, DtAtual, 103) = ?", NHibernateUtil.DateTime, Projections.Property("DtAtual")), data));

//tbm ja tentei isso!!
//cr.Add(Restrictions.Eq(Projections.SqlFunction("convert", NHibernateUtil.Character, Projections.Property("DtAtual")), data));

var horario = ActiveRecordMediator<Horario>.FindFirst(cr, Order.Desc("DtAtual"));
h = horario;
            
return h.DtAtual;

alguem pode me ajudar nessa questao da conversao de datas. Achei um post aki falando exatamente o q eu qria, mas com o Hibernate. Preciso que funcione usando o NHibernate.
Acredito q deve esta entre o restriction e o projection!

ajuda aew

agradeço

1 Resposta

jamirdeajr

Olá thursilva,

Tenho usado sem problemas o Criteria do NHibernate com datas, já usava antes Hibernate com java também.
Obs. Eu uso o Restrictions em vez de Expression pois este está ‘semi-deprecated’.

No teu caso eu faria assim:

DetachedCriteria cr = DetachedCriteria.For<Horario>(); cr.Add(Restrictions.Eq("Tipo", "003")); // Você quer somente o Cartão que terminar com '008' certo? , neste caso não inclua o % do SQL. Ou for like %..% use MatchMode.Anywhere cr.Add(Restrictions.Like("Cartao", u.Cartao,MatchMode.End)); cr.Add(Restrictions.Eq("DtAtual", data));
Pode ser que o que esteja fazendo retornar null não seja a data mas o campo que usa ‘like’

Boa sorte aí!

Criado 29 de novembro de 2011
Ultima resposta 29 de nov. de 2011
Respostas 1
Participantes 2