public static IHtmlContent AggregationOperatorHtml(this Column col, Type destinationType, IStringLocalizer localizer, string selection, string selectCss = null) { if (!col.CanAggregate) { return(null); } var expression = col.For; Type sourceType = expression.Metadata.ContainerType; Type propertyType = expression.Metadata.ModelType; if (destinationType == null) { destinationType = sourceType; } else if (!sourceType.GetTypeInfo().IsAssignableFrom(destinationType)) { return(null); } var path = expression.Name; bool simple = path.IndexOf('.') < 0; string countDistinctAlias = null; var operations = QueryAttribute.AllowedAggregationsForType(propertyType, col.Queries.Value); string displayName = null; if (!simple) { operations = operations & (GroupingOptions.Group); } else if (col.ColumnConnection != null) { operations = operations & (GroupingOptions.Group | GroupingOptions.CountDistinct); displayName = col.ColumnConnection.DisplayProperty.Name; } if ((operations & GroupingOptions.CountDistinct) == GroupingOptions.CountDistinct) { var ti = destinationType.GetTypeInfo(); var prop = ti.GetProperty(path + "Count"); if (prop == null || !canCount(prop.PropertyType)) { prop = ti.GetProperty(path); } if (prop != null && canCount(prop.PropertyType)) { countDistinctAlias = prop.Name; } } if (countDistinctAlias == null) { operations = operations & (~GroupingOptions.CountDistinct); } if (operations == GroupingOptions.None) { return(null); } var selections = QueryAttribute.GroupOptionsToEnum(operations); StringBuilder sb = new StringBuilder(); sb.Append("<select name ='"); sb.Append(path); sb.Append("' "); if (displayName != null) { sb.Append("data-display-name='"); sb.Append(displayName); sb.Append("' "); } if (!string.IsNullOrEmpty(selectCss)) { sb.Append("class='"); sb.Append(selectCss); sb.Append("' "); } if (countDistinctAlias != null) { sb.Append("data-count-distinct='"); sb.Append(countDistinctAlias); sb.Append("' "); } sb.Append(">"); foreach (var option in selections) { sb.Append("<option value='"); sb.Append(HtmlEncoder.Default.Encode(option.Key)); sb.Append("' "); if (option.Key == selection) { sb.Append("selected "); } sb.Append(">"); sb.Append(HtmlEncoder.Default.Encode(localizer == null ? option.Value : localizer[option.Value])); sb.Append("</option>"); } sb.Append("</select>"); return(new HtmlString(sb.ToString())); }