NHibernate – Criteria comparando valor de um objeto

Imagine a seguinte situação: Você possui uma classe chama Country e outra chamada State, que possui um Country (ou o inverso, um Country que possui uma lista de estados).

    public class Country
    {
        public virtual string Iso { get; set; }
        public virtual string Iso3 { get; set; }
        public virtual string Name { get; set; }

        public Country()
        {
        }
    }

    public class CountryMap : ClassMapping
    {
        public CountryMap()
        {
            Id(x => x.Iso, m => m.Column("Iso"));
            Property(x => x.Name);
            Property(x => x.Iso3);
        }
    }

    public class State
    {
        public virtual long Id { get; set; }
        public virtual string Name { get; set; }
        public virtual string UF { get; set; }
        public virtual Country Country { get; set; }

        public State()
        {
        }

        public State(string name)
        {
            this.Name = name;
        }
    }

    public class StateMap : ClassMapping
    {
        public StateMap()
        {
            Id(x => x.Id);
            Property(x => x.Name);
            Property(x => x.UF);
            ManyToOne(x => x.Country, m =>
            {
                m.Cascade(Cascade.All);
                m.Column("countryId");
            });
        }
    }

Ao criarmos uma consulta de todos os estados de um determinado país, a primeira coisa que nos vem a cabeça seria da seguinte maneira:

public IList GetAllStatesFrom(Country country)
{
    using (ISession session = NHibernateHelper.OpenSession())
        return session.CreateCriteria()
            .Add(Restrictions.Eq("Country.Iso", country.Iso)).List();
}

Porém esta consulta, como você perceberá, não funciona. Isso ocorre pois você precisa criar primeiramente um alias para Country, para depois realizar a comparação:

public IList GetAllStatesFrom(Country country)
{
    using (ISession session = NHibernateHelper.OpenSession())
        return session.CreateCriteria()
            .CreateAlias("Country", "c")
            .Add(Restrictions.Eq("c.Iso", country.Iso)).List();
}

Por hoje é só 😉
Abraço 😉

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s