我有这样的代码:
if (pertinentDataExists) {
List<Entity> operatorList = new List<Operator>();
List<Entity> newOperatorList = criteria.newOperatorList;
foreach (Operator operator in operatorList)
{
operatorList.Add(operator);
}
queryCriteria.CreateCriteria("OperatorList").Add(Restrictions.In("Operator", operatorList));
}
,然后:
if (otherPertinentDataExists) {
Object[] objects = new Object[criteria.newRoleTypeList.Count];
for (int = 0; i < criteria.RoleTypeList.Count; i++) {
objects[i] = criteria.RoleTypeList[i].Id;
}
queryCriteria.CreateCriteria("OperatorList").Add(Restrictions.In("Role", objects));
}
这些单独工作很好。但是,如果两种情况都有要添加到列表中的条件,则得到:
NHibernate。QueryException消息:重复的关联路径:OperatorList
如果已经创建了条件,我如何为Role
添加限制?
有两种选择。首先,如果可能的话(在同一个方法中),创建Criteria并将其作为局部变量引用:
var operatorListCriteria = queryCriteria.CreateCriteria("OperatorList");
if ( myCondition1 )
{
operatorListCriteria.Add(...
}
if ( myCondition2 )
{
operatorListCriteria.Add(...
}
第二,使用"alias"创建条件,然后,稍后,在任何地方,您都可以使用GetCriteriaByAlias(aliasPath)
找到它们:
var aliasPath = "OperatorListAlias";
var operatorListCriteria = queryCriteria.CreateCriteria("OperatorList", aliasPath);
...
// later find them by aliasPath
var subCriteria = queryCriteria.GetCriteriaByAlias(aliasPath);
注意:还要检查GetCriteriaByPath(associationPath)