这可能是显而易见的事情,但我几个小时来一直在敲打它,无法弄清楚我哪里出错了。
我正在尝试运行一小段代码来测试向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。
感谢。
答案 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;
}