c# – NHibernate如何查询IList属性?

我试图查询一个IList< string>属性我的一个域类使用NHibernate.以下是一个简单的示例:
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; }
}

像这样映射:

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

我可以保存和检索很好.现在查询我的域类的实例,其中标签属性包含一个指定的值:

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

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

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

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

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

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

解决方法

所以因为Criteria API的限制,我决定弯曲我的域类适合.

我为标签创建了一个实体类.我甚至不能创建它作为一个价值对象.它必须有自己的id.

我现在感到肮脏但是,不用诉诸字符串操作就可以构建一个动态查询对我而言比对域更重要.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...