NHibernate ¿Cómo hago una consulta en contra de una propiedad IList <string>?

Estoy tratando de consultar una propiedad <string> de IList en una de mis clases de dominio usando NHibernate. Aquí hay un ejemplo simple para demostrar:

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; }
}

Asignado de esta manera:

<class name="Demo">
<id name="Id" />
<property name="Name" />
<bag name="Tags">
  <key column="DemoId"/>
  <element column="Tag" type="String" />
</bag>

Y soy capaz de guardar y recuperar bien. Ahora para consultar las instancias de mi clase de dominio donde la propiedad Etiquetas contiene un valor específico:

var demos = this.session.CreateCriteria<Demo>()
            .CreateAlias("Tags", "t")
            .Add(Restrictions.Eq("t", "a"))
            .List<Demo>();

Resultados en el error: colección no fue una asociación: Demo.Tags

var demos = (from d in this.session.Linq<Demo>()
                     where d.Tags.Contains("a")
                     select d).ToList();

Resultados en el error: Referencia de objeto no establecida en una instancia de un objeto.

var demos = this.session.CreateQuery("from Demo d where :t in elements(d.Tags)")
            .SetParameter("t", "a")
            .List<Demo>();

Funciona bien, pero como mi clase de dominio real tiene muchas propiedades, y estoy creando una consulta dinámica complicada, la manipulación de cadenas feas no es mi primera opción. Prefiero usar ICriteria o Linq. Tengo una interfaz de usuario donde se pueden introducir diferentes criterios de búsqueda posibles. El código que construye la ICriteria en este momento tiene docenas de líneas. Realmente odiaría convertir eso en manipulación de cadenas HQL.

Respuestas a la pregunta(6)

Su respuesta a la pregunta