I had a scenario the other day where I need to use the CRM SDK to do a query simlar to this 'WHERE column1 = value AND (column2=value1 OR column2=value2)' , this was pretty easy to accomplish once I understood difference between Filters and Conditions on the QueryExpression object. Here is how the previous query maps out to Conditions and Filters.
column1 = value //is a condition
(column2=value1 OR column2=value2) //is a filter
So basically the way to build it is to create a condition expression for (column2=value1 OR column2=value2) and add that as a filter expression to the top level expression. The following code demonstrates.
Dim column1Condition As New CRMService.ConditionExpression
column1Condition.AttributeName = "column1"
column1Condition.Operator = CRMService.ConditionOperator.Equal
column1Condition.Values = New Object() {value}
Dim column2Value1Condition As New CRMService.ConditionExpression
column2Value1Condition.AttributeName = "column2"
column2Value1Condition.Operator = CRMService.ConditionOperator.Equal
column2Value1Condition.Values = New Object() {value1}
Dim column2Value2Condition As New CRMService.ConditionExpression
column2Value2Condition.AttributeName = "column2"
column2Value2Condition.Operator = CRMService.ConditionOperator.Equal
column2Value2Condition.Values = New Object() {value2}
Dim qe As New CRMService.QueryExpression
Dim secondLevelFilter As CRMService.FilterExpression = New CRMService.FilterExpression
secondLevelFilter.FilterOperator = CRMService.LogicalOperator.Or
secondLevelFilter.Conditions = New CRMService.ConditionExpression {column2Value1Condition, column2Value2Condition}
Dim topLevelFilter As CRMService.FilterExpression = New CRMService.FilterExpression
topLevelFilter.FilterOperator = CRMService.LogicalOperator.And
topLevelFilter.Conditions = New CRMService.ConditionExpression {column1Condition}
topLevelFilter.Filters = New CRMService.FilterExpression {secondLevelFilter}
qe.Criteria = topLevelFilter