0

バックグラウンド:

学生の属性と指導教員の受け入れ状況に基づいて、大学生に指導教員を割り当てるシステムを構築しています。ここで、学生の処理と CRM および Active Directory への変更のコミットを開始する前に、考えられるすべての学生にアドバイザーを割り当てることができるかどうかを確認したいと考えています。約 15,000 件のレコードがあるため、すべての学生にアドバイザーがいない限り、変更をコミットしたくありません。

現在のシステムには、「AdvisorRules」のリストを保持する「AdvisorGroup」オブジェクトがあります。「AdvisorRules」オブジェクトは CRM から取り込まれます。

class AdvisorRule
{
    public AdvisorCondition Condition { get; set; }
    public AdvisorField Field { get; set; }
    public String Value { get; set; }
}

AdvisorConditionLessThanEqual、GreaterThanEqual、または Equal のいずれかです。AdivsorFieldCredit (各アドバイザーが受け入れるクレジット数)、international (アドバイザーが意図的な学生を受け入れる場合)、honors (アドバイザーが優等生を受け入れるかどうか)、および lastName (アドバイザーが受け入れる姓) を指定できます。

「Value」は、「AdvisorField」と比較されるターゲットです。たとえば、AdvisorGroup 内の AdvisorRules のリストは、次のルールを保持できます。

  1. AdvisorCondition = "等しい" AdvisorField = "インターナショナル" 値 = いいえ
  2. AdvisorCondition = "Equal" AdvisorField = "honors" 値 = いいえ
  3. AdvisorCondition = "LessThanEqual" AdvisorField = "Credit" 値 = 89
  4. AdvisorCondition = "Equal" AdvisorField = "LastName" 値 = A
  5. AdvisorCondition = "Equal" AdvisorField = "LastName" 値 = B

このアドバイザーは、名字が A または B で始まり、単位数が 89 未満で、留学生でも優等生でもない学生を受け入れます。


質問:

処理を開始する前に、可能性のあるすべての学生にアドバイザーが割り当てられていることを確認する方法はありますか? 私は自分のコーディングで極端に明示的にならないようにしています。私はこのようなことを考えていましたが、より良い方法を見つけることができれば、再設計することができます:

    private bool checkRuleCoverage()
    {
        //somehow generate list of possible scenarios here
        foreach (possible scenario in list of possible scenarios)
        {
            bool covered = isCovered(possible scenario);
            if(!covered) {throw error  and return}
        }
    }

    private bool isCovered(List<AdvisorGroup> adGroups, possibleScenario ps)
    {
        foreach (AdvisorGroup advisor in adGroups)
        {
            foreach (AdvisorRule rule in advisor.rules)
            {
                if(advisor.rules == ps)
                    return true;
            }
        }
        return false;
    }
4

1 に答える 1

0

データベースにすべての生徒の記録がある場合、解決策は、適切なインデックスを付けたセット ロジックを使用して答えを取得することです。たとえば、アドバイザー ルールが適用される可能性のある各値に沿って学生の体を並べ替えるように、独自のソリューションをコーディングできます。

次に、反復せずに (並べ替えるために既に反復しましたが)、特定の列車で x 未満または y を超えるすべての学生を見つけて、それを別の統計の範囲外の学生と比較することができます。 . Mao47 のコメントが示唆するようなすべての統計の範囲外の学生は、お勧めできません。

もちろん、これを C# でコーディングするのにかかった時間内に、advisor ルールを反復処理して範囲の値を見つけ、これを SQLServer や MySQL、または設定されている任意の DB の select の where 句に適用することができました。ベース。

もちろん、この大雑把なチェックでは、学生が 1 つのアドバイザー ルールを除くすべての範囲外にあり、アドバイザーにも他の要件があるため、その 1 つのルールでは不十分な部分的なルール セットの可能性を見逃しています。これを解決するには、複数の advisor-rule-set-ranges を用意する必要があります。最悪の場合、すべての advisor-rules を反復処理することになります。ルール プロパティの学生のスコアが適切にインデックス化されている限り、DB でこれを行うことはおそらく問題ありません。

于 2013-08-02T18:52:03.850 に答える