NHibernate Como posso consultar uma propriedade IList <string>?
Eu estou tentando consultar uma propriedade IList <string> em uma das minhas classes de domínio usando o NHibernate. Aqui está um exemplo simples para demonstrar:
public class Demo
{
public Demo()
{
this.Tags = new List<string>();
}
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<string> Tags { get; set; }
}
Mapeado assim:
<class name="Demo">
<id name="Id" />
<property name="Name" />
<bag name="Tags">
<key column="DemoId"/>
<element column="Tag" type="String" />
</bag>
E eu sou capaz de salvar e recuperar muito bem. Agora, para consultar instâncias da minha classe de domínio em que a propriedade Tags contém um valor especificado:
var demos = this.session.CreateCriteria<Demo>()
.CreateAlias("Tags", "t")
.Add(Restrictions.Eq("t", "a"))
.List<Demo>();
Resultados no erro: a coleta não foi uma associação: Demo.Tags
var demos = (from d in this.session.Linq<Demo>()
where d.Tags.Contains("a")
select d).ToList();
Resulta no erro: Objct reference não definida para uma instância de um objeto.
var demos = this.session.CreateQuery("from Demo d where :t in elements(d.Tags)")
.SetParameter("t", "a")
.List<Demo>();
Funciona bem, mas como minha classe de domínio real tem muitas propriedades, e estou construindo uma consulta dinâmica complicada, fazer manipulação feia de strings não é minha primeira escolha. Eu preferiria usar ICriteria ou Linq. Eu tenho uma interface de usuário onde muitos possíveis critérios de pesquisa possíveis podem ser inseridos. O código que constrói a ICriteria agora é dezenas de linhas. Eu realmente odiaria transformar isso em manipulação de strings HQL.