2015-03-13 24 views
-1

合併查詢過濾器我想寫以下(僞)在C#中查詢CRM 4:與CRM FilterExpression

Status = active 
AND 
(
    mail = somemail 
    OR 
    (
     firstName like firstNameSearchTerm 
     AND 
     lastName like LastNameSearchTerm 
    ) 
) 

的問題是,中間名可能是的firstName或姓氏組成部分。我很難把它放到ConditionExpressions/FilterExpressions中。

#region mail conditions 
      // Create the ConditionExpression. 
      ConditionExpression mail1Condition = new ConditionExpression(); 
      mail1Condition.AttributeName = "emailaddress1"; 
      mail1Condition.Operator = ConditionOperator.Like; 
      mail1Condition.Values = new object[] { Registration.Email }; 

      ConditionExpression mail2Condition = new ConditionExpression(); 
      mail2Condition.AttributeName = "emailaddress2"; 
      mail2Condition.Operator = ConditionOperator.Like; 
      mail2Condition.Values = new object[] { Registration.Email }; 

      ConditionExpression mail3Condition = new ConditionExpression(); 
      mail3Condition.AttributeName = "emailaddress3"; 
      mail3Condition.Operator = ConditionOperator.Like; 
      mail3Condition.Values = new object[] { Registration.Email }; 

      ConditionExpression statusCondition = new ConditionExpression(); 
      statusCondition.AttributeName = "statuscode"; 
      statusCondition.Operator = ConditionOperator.Equal; 
      statusCondition.Values = new object[] { "1" }; 

      FilterExpression mailFilter = new FilterExpression(); 
      mailFilter.FilterOperator = LogicalOperator.Or; 
      mailFilter.Conditions = new ConditionExpression[] { mail1Condition, mail2Condition, mail3Condition }; 

      #endregion mail conditions 

      #region name conditions 




      /* FIRST NAME */ 
      FilterExpression firstNameFilter = new FilterExpression(); 
      firstNameFilter.FilterOperator = LogicalOperator.Or; 
      List<ConditionExpression> firstNameConditions = new List<ConditionExpression>(); 

      var firstAndMiddleNames = Registration.FirstName.Trim().Split(' '); 
      firstAndMiddleNames = firstAndMiddleNames.Select(s => s.Replace(s, "%"+s+"%")).ToArray(); // Add wildcard search 
      foreach (var item in firstAndMiddleNames) 
      { 
       ConditionExpression firstNameCondition = new ConditionExpression(); 
       firstNameCondition.AttributeName = "firstname"; 
       firstNameCondition.Operator = ConditionOperator.Like; 
       firstNameCondition.Values = new object[] { item }; 
       firstNameConditions.Add(firstNameCondition); 
      } 
      firstNameFilter.Conditions = firstNameConditions.ToArray(); 

      /* LAST NAME */ 
      FilterExpression lastNameFilter = new FilterExpression(); 
      lastNameFilter.FilterOperator = LogicalOperator.Or; 
      List<ConditionExpression> lastNameConditions = new List<ConditionExpression>(); 
      var lastAndMiddleNames = Registration.LastName.Trim().Split(' '); 
      lastAndMiddleNames = lastAndMiddleNames.Select(s => s.Replace(s, "%" + s + "%")).ToArray(); // Add wildcard search 
      foreach (var item in lastAndMiddleNames) 
      { 
       ConditionExpression lastNameCondition = new ConditionExpression(); 
       lastNameCondition.AttributeName = "lastname"; 
       lastNameCondition.Operator = ConditionOperator.Like; 
       lastNameCondition.Values = new object[] { item }; 
       lastNameConditions.Add(lastNameCondition); 
      } 
      lastNameFilter.Conditions = firstNameConditions.ToArray(); 



      #endregion name conditions 

      FilterExpression nameFilter = new FilterExpression(); 
      nameFilter.FilterOperator = LogicalOperator.And;     
      nameFilter.Filters = new FilterExpression[] { firstNameFilter, lastNameFilter }; 


      // Create the outer most filter to AND the state condition with the other filters 
      FilterExpression stateFilter = new FilterExpression(); 
      stateFilter.FilterOperator = LogicalOperator.And; 
      stateFilter.Conditions = new ConditionExpression[] { statusCondition }; 
      stateFilter.Filters = new FilterExpression[] { nameFilter }; 

      query.EntityName = EntityName.contact.ToString(); 
      query.Criteria = stateFilter; 
      query.ColumnSet = columns; 
      BusinessEntityCollection contacts = Service.RetrieveMultiple(query); 

我 查詢目前繞過調試目的的郵件過濾器。 結果是它找到所有匹配名字或姓氏的聯繫人(應該是AND)。爲什麼???

回答

0

有以下行一個簡單的拼寫錯誤

lastNameFilter.Conditions = firstNameConditions.ToArray(); 

應該

lastNameFilter.Conditions = lastNameConditions.ToArray();