背景
我正在建立一个系统,根据学生的属性和顾问的接受情况,为大学生分配学术顾问。现在,我想在开始处理学生并对CRM和Active Directory进行更改之前,检查是否可以为每个可能的学生分配顾问。大约有15,000条记录,所以除非所有学生都有顾问,否则我不想提交更改。
我当前的系统有一个'AdvisorGroup'对象来保存'AdvisorRules'列表。我的'AdvisorRules'对象是从CRM填充的:
class AdvisorRule
{
public AdvisorCondition Condition { get; set; }
public AdvisorField Field { get; set; }
public String Value { get; set; }
}
AdvisorCondition
可以是LessThanEqual,GreaterThanEqual或Equal。 AdivsorField
可以是学分(每个顾问将接受多少学分),国际(如果顾问接受有意的学生),荣誉(如果顾问接受或不接受学生)和lastName(顾问将接受的姓氏)。
'价值'是与'AdvisorField'进行比较的目标。例如,AdvisorGroup中的AdvisorRules列表可以包含以下规则:
该顾问将接受姓名以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;
}
答案 0 :(得分:0)
如果您在数据库中拥有所有学生记录,那么解决方案是使用具有适当索引的设置逻辑来获得答案。例如,您可以编写自己的解决方案,以便按照顾问规则适用的每个可能值对学生团体进行排序。
然后,没有迭代(虽然你已经迭代以便排序)你可以找到某个列车上x或y以下的所有学生,然后将其与另一个统计范围外的学生进行比较等等。
表示,如毛泽东的评论所提出的所有统计数据范围之外的任何学生都是不可取的。当然,在你用C#编写代码的时候,你可能只是迭代了顾问规则并找到了范围的值,并将其应用于SQLServer或MySQL或任何数据库上的select中的where子句这是基于集合的。
当然,这种粗略的检查错过了部分规则集的可能性,其中学生不在除1个顾问规则之外的范围内,然后这1个规则是不够的,因为顾问也有其他要求。为了解决这个问题,您必须拥有多个顾问规则集范围,或者更确切地说,您将在最坏的情况下迭代所有顾问规则。只要学生在规则属性上的分数被正确编入索引,在数据库中执行此操作可能仍然可以。