0

ユーザーがデータベースを照会するための基準を指定できるフォームがあります。

このフォームは「criterion」オブジェクトを作成し、それを使用して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 c2つの異なる可能性がある(a and b) or cと考えてください。a and (b or c)したがって、a = false2つの異なる答えが得られる場合。基準のツリーを構築する必要があります

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 に答える