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

NHibernate析取导致AND查询而不是OR,nhibernate,Nhibernate,这可能是显而易见的,但我已经用头撞了几个小时,不知道哪里出了问题 我试图运行一小段代码来测试向NHibernate查询中添加OR条件。这是我的代码: using (ISession session = NHibernateHelper.OpenSession()) { ICriteria criteria = session.CreateCriteria<TestObject>(); int[] ids = {1, 2, 3}; foreach (int i

这可能是显而易见的,但我已经用头撞了几个小时,不知道哪里出了问题

我试图运行一小段代码来测试向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;
}
使用(ISession session=NHibernateHelper.OpenSession())
{
ICriteria criteria=session.CreateCriteria();
int[]id={1,2,3};
foreach(id中的int-id)
{
ICriterion标准=限制。等式(“Id”,Id);
criteria.Add(Restrictions.Disjunction().Add(criteria));
}
IList items=criteria.List();
退货项目;
}
这只是一件简单的事情,我希望返回ID为1-3的所有测试对象。但是,当我运行代码时,生成的查询是查找ID=1、ID=2和ID=3的对象。毫不奇怪,它不会返回任何东西

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

我是不是做错了什么?我在网上看到的任何使用析取的例子似乎都是这样使用的。我只是不明白为什么它一直在使用和使用


谢谢。

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

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:-)

为了澄清,您的原始代码将生成如下内容(在伪代码中):


由于没有“或”的内容,析取被悄悄地省略了。

根据CHSSLY76的答案更新了代码:

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;
}
使用(ISession session=NHibernateHelper.OpenSession())
{
ICriteria criteria=session.CreateCriteria();
析取=限制。析取();
int[]id={1,2,3};
foreach(id中的int-id)
{
ICriterion标准=限制。等式(“Id”,Id);
析取.加(标准);
}
标准。添加(析取);
IList items=criteria.List();
退货项目;
}

Magic,这真是一种享受。当我看你的代码时,这是有道理的——我从来没有想到它会“和”在一起。对代码的唯一细微更改是将析取创建为:Junction disjunction=Restrictions.disjunction();(ICriterion没有“添加”)。谢谢
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;
}