我们有一个表单,允许用户指定查询数据库的条件。
我们的表单构建“标准”对象,然后用于构建nHibernate标准。
我们目前的代码是:
public virtual ICriteria BuildCriteria(ICriteria criteria)
{
foreach (SheCriterion criterion in this.SheCriterions)
{
if (criterion.OperatorKey == "OR")
{
//// code required here to process ORs
}
criteria.Add(criterion.BuildCriterion());
}
return criteria;
}
不幸的是,这就是我被困住的地方 - 如果我们和每个标准都没有问题但我在解决如何添加OR方面遇到困难 - 当我们知道涉及OR时,先前的标准已经处理完毕。
有人可以帮忙吗?
答案 0 :(得分:2)
or
并不容易。考虑a and b or c
有两种不同的可能性(a and b) or c
和a and (b or c)
,因此如果a = false
您将得到两个不同的答案。你必须在
public virtual ICriteria BuildCriteria(ICriteria criteria)
{
foreach (SheCriterion criterion in this.SheCriterions)
{
criteria.Add(criterion.BuildCriterion());
}
return criteria;
}
public virtual ICriterion BuildCriterion()
{
if (OperatorKey == "OR")
{
return new Disjunction()
.Add(Left.BuildCriterion())
.Add(right.BuildCriterion());
}
else
{
return new Conjunction()
.Add(Left.BuildCriterion())
.Add(right.BuildCriterion());
}
}
更新:否则你需要一棵树
Man { Name = "Bill", Eyecolor = "blue", Height = 175, IsRich = true };
// will show Bill
SELECT * FROM Men WHERE height > 180 AND eyecolor = blue OR IsRich = 1
SELECT * FROM Men WHERE (height > 180 AND eyecolor = blue) OR IsRich = 1
// will not show Bill
SELECT * FROM Men WHERE height > 180 AND (eyecolor = blue OR IsRich = 1)