2

私はこのコードを持っています:

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条件が既に作成されている場合、制限を追加するにはどうすればよいですか?

4

1 に答える 1

2

2 つのオプションがあります。最初に、可能であれば (同じメソッド内で)、基準を作成し、それらをローカル変数として参照します。

var operatorListCriteria = queryCriteria.CreateCriteria("OperatorList");

if ( myCondition1 )
{
  operatorListCriteria.Add(...
}
if ( myCondition2 )
{
  operatorListCriteria.Add(...
}

次に、「エイリアス」を使用して条件を作成し、後でどこでも次のように見つけることができますGetCriteriaByAlias(aliasPath)

var aliasPath = "OperatorListAlias";
var operatorListCriteria = queryCriteria.CreateCriteria("OperatorList", aliasPath);
...
// later find them by aliasPath
var subCriteria = queryCriteria.GetCriteriaByAlias(aliasPath);

注: また、GetCriteriaByPath(associationPath)

于 2013-01-04T06:47:06.560 に答える