3

技術的な質問というよりは、デザインに関連した質問の一種です。タイトルは完璧ではないかもしれませんので、お気軽に編集してください。

以下の要件があります。SQLServer2012の特定のjobEntity(SQL Serverジョブと混同しないでください)の資格をテーブルから保存したい。同じ目的で、資格と言う別のテーブルがあります。これは、ジョブテーブルとの参照整合性を持つジョブに対して上記の資格を保存します。これを作成するためのストアドプロシージャには、パラメータJobIDとスキーマのユーザー定義テーブルタイプがあります。

CREATE TYPE [dbo].[TableTypeQualificationJob] AS TABLE(
    [QualificationID] [int] NULL,
    [QualificationCriteria] [nvarchar](4000) NULL,
    [OptionTo] [bigint] NULL
)
GO

ビジネスレイヤーに対応するエンティティがあります。したがって、ユーザーがジョブの複数の資格を作成すると、リストを関数に渡し、基になるメソッドがリストをデータテーブルに変換し、ストアドプロシージャを使用してデータベースに追加されます。

キャッチは、ORまたはANDでできる資格です。たとえば、資格が5つある場合は、資格1資格2資格3資格4資格5と言います。

として仕事に強制

qualification1 OR qualification2 OR qualification3 AND qualification4 AND qualification5

つまり、3つのグループを作成します

(qualification1 OR qualification2 OR qualification3)AND(qualification4)AND(qualification5)

では、QualificationEntityクラスとデータベースでそれをどのように解釈できますか。リストをユーザー定義のテーブルタイプのDataTableに手動で変換してADO.NETを使用してSPを呼び出していますが、どのように実装できますか?

4

1 に答える 1

3

とを別々のエンティティとして保存OrQualificationsAndQualifications、両方をエンティティとの多対多の参照として保持しJobます。これにより、資格を区別できます。

申請者が適切な資格を持っているかどうかを確認するには、AndQualificationエンティティ内のすべての資格が満たされていること、およびエンティティ内のすべての資格が満たされていることを確認しますOrQualifications


編集:

上記/最初の回答は、必要な資格の1つのリストと、少なくとも1つが必要な別のリストの要件を満たすことを目的としていました。私にはこれで十分だと思いますが、本当にネストされた資格が必要ですか?私を信じてください。アプリケーションを必要以上に複雑にするのは悪い考えです。

式ツリー
ネストされた資格は別の獣であり、ここに1つの提案された解決策があります:式は完全な二分木(各ノードが正確に0または2つの子を持つ二分木)として保存されます。このツリーのすべてのノードは、修飾となるリーフを除いて、演算子ANDまたはOR(&または|)で構成されます。

式の例:
(A | B&C)| (D&E)

(式からツリーへの変換は、データの入力方法に完全に依存します。最も簡単なのは、ツリーを手動で作成することです!)

ツリーとして:

      |
   / \
  | &
 / \ / \
A&DE
   / \
  紀元前

このツリーをデータベースに永続化する方法については、さまざまな選択肢があります。例:

  • 絶対最小値が2つの列、1つはId、もう1つはParentIdである階層モデル。ツリーをフェッチするには、再帰クエリが必要です。このオプションは、リレーショナルデータベースにとってはかなり厳しいものになる可能性があります。
  • ツリーをxml(XmlSerializer)またはjson(json.NET)などとしてシリアル化し、テキストとして保存します。

個人的には、シリアル化オプションを選択します。これは、常に完全なツリーが必要であり、データ構造に逆シリアル化するのが簡単だからです。

データ構造の例を次に示します。

public class Node
{
    public Node LeftChild { get; set; }
    public Node RightChild { get; set; }
}

class OperatorNode : Node
{
    public bool IsAnd { get; set; }
}

class QualificationNode : Node
{
    public bool IsQualificationMet { get; set; }
}

次に、このツリーを解析してtrueまたはfalseを出力できる関数が必要です。

public bool EvaluateNode( Node node )
{
    var qualificationNode = node as QualificationNode;
    if ( qualificationNode != null )
    {
        return qualificationNode.IsQualificationMet;
    }
    var operatorNode = node as OperatorNode;
    if ( operatorNode.IsAnd )
    {
        return EvaluateNode( node.LeftChild ) && EvaluateNode( node.RightChild );
    }
    return EvaluateNode( node.LeftChild ) || EvaluateNode( node.RightChild );
}

免責事項:これはいわゆる迅速で汚いコードです。何かを改善してください。

その他のオプション
System.Linq.Expressions.Expressionを調べます。プログラムでロジックを構築するために使用できるので、おそらくこれを使用できます。

于 2013-01-08T12:37:32.173 に答える