I am using Condition expression but I'm unable to add more than one condition to a FilterExpression
.
Can any one help? I have posted my source code here.
ConditionExpression with Filters:
// Filter1
FilterExpression filter1 = new FilterExpression();
filter1.FilterOperator = LogicalOperator.And;
filter1.Conditions.Add(new ConditionExpression("A_LogicalName", ConditionOperator.Equal, id1));
filter1.Conditions.Add(new ConditionExpression("B_LogicalName", ConditionOperator.Equal, id2));
query.Criteria.Filters.Add(filter1);
// Filter2
FilterExpression filter2 = new FilterExpression();
filter2.FilterOperator = LogicalOperator.And;
filter2.Conditions.Add(new ConditionExpression("B_LogicalName", ConditionOperator.Equal, id3));
filter2.Conditions.Add(new ConditionExpression("C_LogicalName", ConditionOperator.Equal, id4));
q_ShoppingCartItemQuantityCheck.Criteria.Filters.Add(filter2);
Filter Expression is a technique used in DynamoDB to filter data during scan or query operations. They are highly similar to WHERE clauses in SQL. However, they behave slightly differently because of the nature of NoSQL.
DynamoDB offers two ways to access information stored: Query and Scan. A Query will rely on the primary-key to find information. Query can point directly to a particular item (or set ot items) and retrieve them in a fast and efficient way. Scan, as the name suggests, will browse table items from start to finish.
This allows Query to retrieve one item with a given partition key value and sort key value, or several items that have the same partition key value but different sort key values. from the docs. It is not supported by DynamoDB and it is actually to save your money.
A Scan operation in Amazon DynamoDB reads every item in a table or a secondary index. By default, a Scan operation returns all of the data attributes for every item in the table or index. You can use the ProjectionExpression parameter so that Scan only returns some of the attributes, rather than all of them.
Here's what I'm using. For some reason, I find it clearer to grasp. It's probably due to the fact that I use initializer syntax so YMMV.
...
Criteria = new FilterExpression
{
FilterOperator = LogicalOperator.Or,
Filters =
{
new FilterExpression
{
FilterOperator = LogicalOperator.And,
Conditions =
{
new ConditionExpression("field1", ConditionOperator.NotNull),
new ConditionExpression("field2", ConditionOperator.NotNull)
}
},
new FilterExpression
{
FilterOperator = LogicalOperator.And,
Conditions =
{
new ConditionExpression("field3", ConditionOperator.NotNull),
new ConditionExpression("field4", ConditionOperator.NotNull)
}
}
}
}
...
Not sure if I understand your question correctly. If I got it right, you want to build a hierarchical expression like this:
(A_logicalName AND B_LogicalName) OR (B_LogicalName AND C_LogicalName)
is that correct?
Wouldn't the following then solve your problem?
query.Criteria = new FilterExpression();
query.Criteria.FilterOperator = LogicalOperator.Or;
FilterExpression filter1 = query.Criteria.AddFilter(LogicalOperator.And);
filter1.Conditions.Add(new ConditionExpression("A_LogicalName", ConditionOperator.Equal, id1));
filter1.Conditions.Add(new ConditionExpression("B_LogicalName", ConditionOperator.Equal, id2));
FilterExpression filter2 = query.Criteria.AddFilter(LogicalOperator.And);
filter2.Conditions.Add(new ConditionExpression("B_LogicalName", ConditionOperator.Equal, id2));
filter2.Conditions.Add(new ConditionExpression("C_LogicalName", ConditionOperator.Equal, id3));
See also example on MSDN.
Condition:
(A_logicalName AND B_LogicalName) OR (B_LogicalName AND C_LogicalName)
can be expressed in this way too:
FilterExpression filter = new FilterExpression(LogicalOperator.Or);
FilterExpression filter1 = new FilterExpression(LogicalOperator.And);
filter1.Conditions.Add(new ConditionExpression("A_LogicalName", ConditionOperator.Equal, id1));
filter1.Conditions.Add(new ConditionExpression("B_LogicalName", ConditionOperator.Equal, id2));
FilterExpression filter2 = new FilterExpression(LogicalOperator.And);
filter2.Conditions.Add(new ConditionExpression("B_LogicalName", ConditionOperator.Equal, id2));
filter2.Conditions.Add(new ConditionExpression("C_LogicalName", ConditionOperator.Equal, id3));
filter.AddFilter(filter1);
filter.AddFilter(filter2);
query.Criteria = filter;
A more complex query can be found on MSDN.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With