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

Kev*_*son 12 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;
}
Run Code Online (Sandbox Code Playgroud)

这只是一些简单的事情,我期望返回ID为1-3的所有测试对象.但是,当我运行的代码,生成的查询是要找到与ID = 1和ID = 2,ID = 3.其中,勿庸置疑,不返回任何对象.

映射的设置正确(我可以添加/编辑/删除/列出所有对象),并且那里有带有这些ID的对象.

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

谢谢.

Chs*_*y76 16

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

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

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

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

WHERE (OR(ID=1)) AND (OR(ID=2)) AND (OR(ID=3))
Run Code Online (Sandbox Code Playgroud)

由于没有任何"或"的东西,因此默认省略了析取.


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