这可能是显而易见的事情,但我几个小时来一直撞到它,无法弄清楚我哪里出错了.
我正在尝试运行一小段代码来测试向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)
由于没有任何"或"的东西,因此默认省略了析取.
基于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)
| 归档时间: |
|
| 查看次数: |
7372 次 |
| 最近记录: |