예제 #1
0
        /// <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));
        }
예제 #2
0
        private DataGridFilterBehavior(IFilterList filterList, IEnumerable itemsSource)
        {
            _itemsSource = itemsSource;
            _filterList  = filterList;

            _filterList.OnSelectionChanged += new Action(FilterSelectionChanged);
        }
예제 #3
0
        //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);
        }
예제 #4
0
        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);
        }
예제 #5
0
 /// <summary>
 /// Inherited IDataService Method
 /// </summary>
 /// <returns></returns>
 public virtual async Task <List <TRecord> > GetFilteredRecordListAsync(IFilterList filterList) => await this.DBContext.CreateDbContext().GetRecordFilteredListAsync <TRecord>(filterList);
예제 #6
0
 public static void SetFilterList(DataGrid collectionViewSource, IFilterList value)
 {
     collectionViewSource.SetValue(FilterListProperty, value);
 }
예제 #7
0
        /// <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();