NHibernate如何查询IList <string>属性?

Joh*_*wis 10 c# linq nhibernate hql icriteria

我试图使用NHibernate查询我的一个域类上的IList <string>属性.这是一个简单的例子来演示:

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; }
}
Run Code Online (Sandbox Code Playgroud)

映射如下:

<class name="Demo">
<id name="Id" />
<property name="Name" />
<bag name="Tags">
  <key column="DemoId"/>
  <element column="Tag" type="String" />
</bag>
Run Code Online (Sandbox Code Playgroud)

我能够保存和检索就好了.现在查询我的域类的实例,其中Tags属性包含指定的值:

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

导致错误:收集不是关联:Demo.Tags

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

导致错误:Objct引用未设置为对象的实例.

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

工作正常,但由于我的真正的域类有很多属性,我正在构建一个复杂的动态查询,做丑陋的字符串操作不是我的第一选择.我更愿意使用ICriteria或Linq.我有一个用户界面,可以输入许多不同的搜索条件.现在构建ICriteria的代码是几十行.我真的很讨厌把它变成HQL字符串操作.

Joh*_*wis 4

因此,由于 Criteria API 的限制,我决定调整我的域类以适应。

我为标签创建了一个实体类。我什至无法将其创建为值对象。它必须有自己的 id。

我现在感觉很脏。但对我来说,能够构建动态查询而不诉诸字符串操作比忠于领域更重要。