public static AggregationContainerDescriptor <T> CardinalityBy <T>(this AggregationContainerDescriptor <T> agg, Expression <Func <T, object> > fieldGetter, Expression <Func <T, bool> > filterRule = null) where T : class { var aggName = fieldGetter.GetAggName(AggType.Cardinality); if (filterRule == null) { return(agg.Cardinality(aggName, x => x.Field(fieldGetter))); } var filterName = filterRule.GenerateFilterName(); agg.Filter(filterName, f => f.Filter(fd => filterRule.Body.GenerateFilterDescription <T>()) .Aggregations(innerAgg => innerAgg.Cardinality(aggName, field => field.Field(fieldGetter)))); return(agg); }