I am just wondering the syntax for doing nested filters in C# ESQ. I looked through documentation and academy, but I was not able to find anything. I want a filter that has a AND and then a nested OR.
Please reference the pseudo-code
(CreatedOn > ThreeHoursAgo && ( Status === "Complete" || Status === "Pending" ))
Code I have so far
var esqFirstFilter = esq.CreateFilterWithParameters(FilterComparisonType.GreaterOrEqual, "CreatedOn", ThreeHoursAgo); esq.Filters.Add(esqFirstFilter);
Like
IIRC, you need to create an EntitySchemaQueryFilterCollection and then populate it with another EntitySchemaQueryFilterCollection for the nested Or. Something like this, but going off top of my head - hopefully this gets you close:
// create filter collection with And var filterGroup = new EntitySchemaQueryFilterCollection(esq, LogicalOperationStrict.And); // add CreatedOn filter filterGroup.Add(esq.CreateFilterWithParameters(FilterComparisonType.GreaterOrEqual, "CreatedOn", ThreeHoursAgo)); // add another filter collection for Status with Or filterGroup.Add(new EntitySchemaQueryFilterCollection(esq, LogicalOperationStrict.Or) { esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Status.Text", "Complete"), esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Status.Text", "Pending") }); // now add filter collection to esq esq.Filters.Add(filterGroup);
Ryan
IIRC, you need to create an EntitySchemaQueryFilterCollection and then populate it with another EntitySchemaQueryFilterCollection for the nested Or. Something like this, but going off top of my head - hopefully this gets you close:
// create filter collection with And var filterGroup = new EntitySchemaQueryFilterCollection(esq, LogicalOperationStrict.And); // add CreatedOn filter filterGroup.Add(esq.CreateFilterWithParameters(FilterComparisonType.GreaterOrEqual, "CreatedOn", ThreeHoursAgo)); // add another filter collection for Status with Or filterGroup.Add(new EntitySchemaQueryFilterCollection(esq, LogicalOperationStrict.Or) { esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Status.Text", "Complete"), esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Status.Text", "Pending") }); // now add filter collection to esq esq.Filters.Add(filterGroup);
Ryan
EntitySchemaQuery esqResult = new EntitySchemaQuery(userConnection.EntitySchemaManager, "YourEntityHere"); esqResult.AddColumn("CreatedOn "); esqResult.AddColumn("Status "); Guid StatusComplete = Guid.Parse("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"); // insert your guid Guid StatusPending = Guid.Parse("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"); // insert your guid //Status Filter esqResult.Filters.Add( new EntitySchemaQueryFilterCollection( esqResult, Terrasoft.Common.LogicalOperationStrict.Or, esqResult.CreateFilterWithParameters(FilterComparisonType.Equal, "Status", StatusComplete), esqResult.CreateFilterWithParameters(FilterComparisonType.Equal, "Status", StatusPending) ) ); //Date Filter TimeZoneInfo userTimeZonInfo = userConnection.CurrentUser.TimeZone; DateTime createdOn = TimeZoneInfo.ConvertTimeToUtc(activity.GetTypedColumnValue<DateTime>("CreatedOn"), userTimeZonInfo); DateTime ThreeHoursAgo = DateTime.Now.AddHours(-3); var dateFilter = new EntitySchemaQueryFilterCollection( esqResult, Terrasoft.Common.LogicalOperationStrict.And, esqResult.CreateFilterWithParameters(FilterComparisonType.GreaterOrEqual, "CreatedOn", ThreeHoursAgo) ); esqResult.Filters.Add( new EntitySchemaQueryFilterCollection( esqResult, Terrasoft.Common.LogicalOperationStrict.And, dateFilter1, ) ); EntityCollection entitites = esqResult.GetEntityCollection(userConnection);