NHibernate析取导致AND查询而不是OR

时间:2009-08-26 16:52:35

标签: nhibernate

这可能是显而易见的事情,但我几个小时来一直在敲打它,无法弄清楚我哪里出错了。

我正在尝试运行一小段代码来测试向NHibernate查询添加OR条件。这是我的代码:

using (ISession session = NHibernateHelper.OpenSession())
{
    ICriteria criteria = session.CreateCriteria<TestObject>();

    int[] ids = {1, 2, 3};
    foreach (int id in ids)
    {
        ICriterion criterion = Restrictions.Eq("Id", id);
        criteria.Add(Restrictions.Disjunction().Add(criterion));
    }

    IList<TestObject> items = criteria.List<TestObject>();
    return items;
}

我只希望返回ID为1-3的所有测试对象。但是,当我运行代码时,生成的查询是查找ID = 1 AND ID = 2 AND ID = 3的对象。毫无疑问,这不会返回任何内容。

映射设置正确(我可以添加/编辑/删除/列出所有对象),其中有些对象带有这些ID。

我做错了什么吗?我在网上看过的任何使用Disjunction的样本似乎都是这样使用的。我只是不明白为什么它继续使用AND。

感谢。

2 个答案:

答案 0 :(得分:16)

你的问题在于你每次都在创建一个 new 析出(循环中)。你需要做的是:

int[] ids = {1, 2, 3};
ICriterion disjunction = Restrictions.Disjunction();
foreach (int id in ids)
{
    ICriterion criterion = Restrictions.Eq("Id", id)
    disjunction.Add(criterion);
}
criteria.Add(disjunction);

语法可能有点不对 - 我是Hibernate而不是.NET: - )

为了澄清,您的原始代码将生成类似(伪代码):

WHERE (OR(ID=1)) AND (OR(ID=2)) AND (OR(ID=3))

由于没有任何“或”的东西,所以默认省略了分离。

答案 1 :(得分:5)

根据ChssPly76的回答更新了代码:

using (ISession session = NHibernateHelper.OpenSession())
{
    ICriteria criteria = session.CreateCriteria<TestObject>();
    Junction disjunction = Restrictions.Disjunction();

    int[] ids = {1, 2, 3};
    foreach (int id in ids)
    {
        ICriterion criterion = Restrictions.Eq("Id", id);
        disjunction.Add(criterion);
    }
    criteria.Add(disjunction);


    IList<TestObject> items = criteria.List<TestObject>();
    return items;
}