代码之家  ›  专栏  ›  技术社区  ›  AwkwardCoder

如何在nhibernate中设置查询多个值的条件

  •  1
  • AwkwardCoder  · 技术社区  · 14 年前

    我想根据列表的内容查询一组结果,我已经为类的一个实例成功地做到了这一点 Foo ,但我不确定我该怎么做 IList<Foo>

    所以对于类的单个实例 ,这有效:

            public ICriteria CreateCriteria(Foo foo)
            {
                return session
                    .CreateCriteria<Component>()
                    .CreateCriteria("Versions")
                    .CreateCriteria("PublishedEvents")
                    .Add(Restrictions.And(Restrictions.InsensitiveLike("Name", foo.Name, MatchMode.Anywhere),
                                          Restrictions.InsensitiveLike("Type", foo.Type, MatchMode.Anywhere)))
                    .SetCacheable(true);
            }
    

    但是当方法参数是 ?

     public ICriteria CreateCriteria(IList<Foo> foos)
        {
            return session
                .CreateCriteria<Component>()
                .CreateCriteria("Versions")
                .CreateCriteria("PublishedEvents")
                .Add(Restrictions.And(Restrictions.InsensitiveLike("Name", foo.Name, MatchMode.Anywhere),
                                      Restrictions.InsensitiveLike("Type", foo.Type, MatchMode.Anywhere)))
                .SetCacheable(true);
        }
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   lomaxx    14 年前

    如果您正在考虑如何处理这个查询,那么在您使用的构造中查询它实际上是没有意义的。唯一的选择是循环并动态创建条件,如下所示:

     public ICriteria CreateCriteria(IList<Foo> foos)
        {
            var criteria = session
                .CreateCriteria<Component>()
                .CreateCriteria("Versions")
                .CreateCriteria("PublishedEvents")
                .SetCacheable(true);
    
            foreach(var foo in foos)
            {
                criteria.Add(Restrictions.And(Restrictions.InsensitiveLike("Name", foo.Name, MatchMode.Anywhere),Restrictions.InsensitiveLike("Type", foo.Type, MatchMode.Anywhere)));
            }
            return criteria;
        }