0

我们有一个表单,它允许用户指定查询数据库的条件。

我们的表单构建“标准”对象,然后用于构建 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 时,之前的标准已经是处理。

任何人都可以帮忙吗?

4

1 回答 1

2

or没那么容易。考虑a and b or c有两种不同的可能性(a and b) or ca 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)
于 2012-07-24T09:51:56.510 回答