/// <summary> /// Inherited IDataService Method /// </summary> /// <returns></returns> public override Task <List <DbWeatherStation> > GetFilteredRecordListAsync(IFilterList filterList) { var firstrun = true; // Get a empty list var list = new List <DbWeatherStation>(); list.AddRange(Records); // if we have a filter go through each filter if (filterList != null && filterList.Filters.Count > 0) { foreach (var filter in filterList.Filters) { // Get the filter propertyinfo object var x = typeof(DbWeatherStation).GetProperty(filter.Key); // if we have a list already apply the filter to the list if (list.Count > 0) { list = list.Where(item => x.GetValue(item).Equals(filter.Value)).ToList(); } // If this is the first run we query the database directly else if (firstrun) { list = this.Records.Where(item => x.GetValue(item).Equals(filter.Value)).ToList(); } firstrun = false; } } return(Task.FromResult(list)); }
private DataGridFilterBehavior(IFilterList filterList, IEnumerable itemsSource) { _itemsSource = itemsSource; _filterList = filterList; _filterList.OnSelectionChanged += new Action(FilterSelectionChanged); }
//private static void OnMultipleFilterListChanged(DependencyObject element, DependencyPropertyChangedEventArgs e) //{ // //var behavior = new DataGridFilterBehavior(element as DataGrid, e.NewValue as IFilterList); // //behavior.ExecuteFilter(); //} private DataGridFilterBehavior(DataGrid dataGrid, IFilterList filterList) { _dataGrid = dataGrid; _filterList = filterList; _filterList.OnSelectionChanged += new Action(FilterSelectionChanged); }
private static IEnumerable <IFilterList> FilterExpressionBuilder(string filter) { //filter = filter.ToLower(); var genericType = typeof(T); var genericTypeName = genericType.Name; var multipleLogicParts = filter.Split('$'); var filterList = new IFilterList[multipleLogicParts.Length]; for (var i = 0; i < multipleLogicParts.Length; i++) { var multipleLogicPart = multipleLogicParts[i]; var filterLogicParts = multipleLogicPart.Split(';'); var logicOperator = filterLogicParts[filterLogicParts.Length - 1]; var(filterLogicPartLength, logicOperatorEnum) = FilterLogicPartLength(logicOperator, filterLogicParts); filterList[i] = new FilterList { Filters = new Filter.Filter[filterLogicPartLength], Logic = logicOperatorEnum }; for (var j = 0; j < filterLogicPartLength; j++) { var filterLogicPart = filterLogicParts[j]; var(key, value) = Operator.Dictionary.FirstOrDefault(x => filterLogicPart.Contains(x.Key)); if (key == null) { throw new FilterOperatorNotFoundException( $"{filterLogicPart} is not found in our Operator.Dictionary"); } var filterObject = filterLogicPart.Split(key); // var property = genericProperties.FirstOrDefault(x => x.Name.ToLower() == filterObject[0]); var propertyInfos = new List <PropertyInfo>(); var property = GetPropertyValue(genericType, filterObject[0], propertyInfos); var lastProperty = property.LastOrDefault(); ((Filter.Filter[])filterList[i].Filters)[j] = new Filter.Filter { Operator = value, DataType = GetFilterDataTypes(lastProperty), Key = genericTypeName + "." + property.Select(x => x.Name).Aggregate((a, b) => a + "." + b), Value = filterObject[1], Assembly = lastProperty?.Module.Name.Replace(".dll", string.Empty), Fullname = lastProperty?.PropertyType.FullName }; } } return(filterList); }
/// <summary> /// Inherited IDataService Method /// </summary> /// <returns></returns> public virtual async Task <List <TRecord> > GetFilteredRecordListAsync(IFilterList filterList) => await this.DBContext.CreateDbContext().GetRecordFilteredListAsync <TRecord>(filterList);
public static void SetFilterList(DataGrid collectionViewSource, IFilterList value) { collectionViewSource.SetValue(FilterListProperty, value); }
/// <summary> /// Generic Method to get a filtered record List from a DbSet /// </summary> /// <typeparam name="TRecord"></typeparam> /// <param name="context"></param> /// <param name="filterList"></param> /// <param name="dbSetName"></param> /// <returns></returns> public async static Task <List <TRecord> > GetRecordFilteredListAsync <TRecord>(this DbContext context, IFilterList filterList, string dbSetName = null) where TRecord : class, IDbRecord <TRecord> { var firstrun = true; // Get the PropertInfo object for the record DbSet var propertyInfo = context.GetType().GetProperty(dbSetName ?? IDbRecord <TRecord> .RecordName); // Get the actual value and cast it correctly var dbset = (DbSet <TRecord>)(propertyInfo.GetValue(context)); // Get a empty list var list = new List <TRecord>(); // if we have a filter go through each filter // note that only the first filter runs a SQL query against the database // the rest are run against the dataset. So do the biggest slice with the first filter for maximum efficiency. if (filterList != null && filterList.Filters.Count > 0) { foreach (var filter in filterList.Filters) { // Get the filter propertyinfo object var x = typeof(TRecord).GetProperty(filter.Key); // if we have a list already apply the filter to the list if (list.Count > 0) { list = list.Where(item => x.GetValue(item).Equals(filter.Value)).ToList(); } // If this is the first run we query the database directly else if (firstrun) { list = await dbset.FromSqlRaw($"SELECT * FROM vw_{ propertyInfo.Name} WHERE {filter.Key} = {filter.Value}").ToListAsync(); } firstrun = false; } } // No list, just get the full recordset else { list = await dbset.ToListAsync(); } return(list); }
public override async Task <List <DbWeatherForecast> > GetFilteredRecordListAsync(IFilterList filterList) => await GetRecordListAsync();