コード例 #1
0
        public void Delegate_Test()
        {
            var test = new Dummy {
                Name = "Test"
            };
            var count     = 10000000;
            var obj       = LambdaExtensions.GetPropertyValue(test, "Name");
            var stopWatch = Stopwatch.StartNew();

            for (int i = 0; i < count; i++)
            {
                LambdaExtensions.GetPropertyValue(test, "Name");
            }
            stopWatch.Stop();
            Logger.WriteLine($"Expression: {stopWatch.ElapsedMilliseconds}");

            var objectType = test.GetType();
            var method     = objectType.GetProperty("Name")?.GetGetMethod(false);
            var proxy      = (DummyCallback <Dummy>)Delegate.CreateDelegate(typeof(DummyCallback <Dummy>), method);

            stopWatch.Restart();
            for (int i = 0; i < count; i++)
            {
                proxy(test);
            }
            stopWatch.Stop();
            Logger.WriteLine($"Delegate: {stopWatch.ElapsedMilliseconds}");
        }
コード例 #2
0
        public void GetPropertyValue_Test()
        {
            var dog = new Dog()
            {
                Foo = "test"
            };
            var v1 = LambdaExtensions.GetPropertyValue(dog, nameof(dog.Foo));

            Assert.Equal(dog.Foo, v1);

            var cat = new Cat()
            {
                Foo = 1
            };
            var v2 = LambdaExtensions.GetPropertyValue(cat, nameof(cat.Foo));

            Assert.Equal(cat.Foo, v2);

            var fish = new Fish()
            {
                Foo = "test"
            };
            var v3 = LambdaExtensions.GetPropertyValue(fish, nameof(fish.Foo));

            Assert.Equal(fish.Foo, v3);

            var persian = new Persian()
            {
                Foo = 1
            };
            var v4 = LambdaExtensions.GetPropertyValue(persian, nameof(persian.Foo));

            Assert.Equal(persian.Foo, v4);
        }
コード例 #3
0
        public void GetProperty()
        {
            var count = 10000;
            var s1    = new Dummy()
            {
                Name = "Argo"
            };

            var pi = s1.GetType().GetProperty("Name");
            var sw = Stopwatch.StartNew();

            for (var i = 0; i < count; i++)
            {
                pi.GetValue(s1);
            }
            sw.Stop();
            Logger.WriteLine($"Reflection: {sw.Elapsed}");

            var invoker = LambdaExtensions.GetPropertyValueLambda <Dummy, string>(s1, "Name").Compile();

            sw = Stopwatch.StartNew();
            for (var i = 0; i < count; i++)
            {
                invoker(s1);
            }
            sw.Stop();
            Logger.WriteLine($"Expression: {sw.Elapsed}");
        }
コード例 #4
0
        public override void Add(T newInstance)
        {
            // use lock ?
            LambdaExtensions.SetPropertyValue(newInstance, _tKeyExpression, GetNewTKey());

            _data.Add(newInstance);
        }
コード例 #5
0
        public void SetProperty()
        {
            var count = 10000;
            var s1    = new Dummy()
            {
                Name = "Argo"
            };

            var sw = Stopwatch.StartNew();
            var pi = s1.GetType().GetProperty("Name");

            for (var i = 0; i < count; i++)
            {
                if (pi != null && pi.CanWrite)
                {
                    if ((Nullable.GetUnderlyingType(pi.PropertyType) ?? pi.PropertyType) == typeof(string) && pi.CanWrite)
                    {
                        pi.SetValue(s1, "Dummy");
                    }
                }
            }
            sw.Stop();
            Logger.WriteLine($"Reflection: {sw.Elapsed}");

            sw = Stopwatch.StartNew();
            var invoker = LambdaExtensions.SetPropertyValueLambda <Dummy, object>(s1, "Name").Compile();

            for (var i = 0; i < count; i++)
            {
                invoker(s1, "Dummy");
            }
            sw.Stop();
            Logger.WriteLine($"Expression: {sw.Elapsed}");
        }
コード例 #6
0
        /// <summary>
        /// 根据JSON格式的条件转换成Linq的条件语句
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="jsWhereFilter">JSON格式的查询条件</param>
        /// <returns>Linq查询条件</returns>
        public static Expression <Func <T, bool> > ConvertJsWhereToLinq <T>(string jsWhereFilter)
        {
            if (string.IsNullOrEmpty(jsWhereFilter))
            {
                return(LambdaExtensions.True <T>());
            }

            Expression <Func <T, bool> > whereLamda = null;
            var whereDic = DeserializeJson <Dictionary <string, string> >(jsWhereFilter);

            if (whereDic == null || !whereDic.Any())
            {
                return(LambdaExtensions.True <T>());
            }
            else
            {
                foreach (var field in whereDic)
                {
                    if (whereLamda == null)
                    {
                        whereLamda = LambdaExtensions.GetContains <T>(field.Key, field.Value);
                    }
                    else
                    {
                        //todo 暂时用AlsoAnd
                        whereLamda = whereLamda.And(LambdaExtensions.GetContains <T>(field.Key, field.Value));
                    }
                }
            }
            return(whereLamda ?? LambdaExtensions.False <T>());
        }
コード例 #7
0
    public void Sort_Queryable()
    {
        var foos = new List <Foo>
        {
            new Foo {
                Name = "10", Count = 10
            },
            new Foo {
                Name = "10", Count = 20
            },
            new Foo {
                Name = "20", Count = 20
            },
        }.AsQueryable();
        var orderFoos = LambdaExtensions.Sort(foos, new List <string>()
        {
            "Count desc", "Name"
        });

        Assert.Equal(20, orderFoos.ElementAt(0).Count);
        Assert.Equal("20", orderFoos.ElementAt(1).Name);

        orderFoos = LambdaExtensions.Sort(foos, "Count", SortOrder.Unset);
        Assert.Equal(10, orderFoos.ElementAt(0).Count);

        orderFoos = LambdaExtensions.Sort(foos, "Count", SortOrder.Desc);
        Assert.Equal(20, orderFoos.ElementAt(0).Count);

        orderFoos = LambdaExtensions.Sort(foos, "Count", SortOrder.Asc);
        Assert.Equal(10, orderFoos.ElementAt(0).Count);

        orderFoos = LambdaExtensions.Sort(foos, "Test", SortOrder.Asc);
        Assert.Equal(10, orderFoos.ElementAt(0).Count);
    }
コード例 #8
0
    public void InvokeMethod()
    {
        var s1 = new Dummy()
        {
            Name = "Argo"
        };
        var mi = s1.GetType().GetMethod("Method");

        Assert.NotNull(mi);

        var sw = Stopwatch.StartNew();

        for (var i = 0; i < Count; i++)
        {
            if (mi != null)
            {
                mi.Invoke(s1, null);
            }
        }
        sw.Stop();
        Logger.WriteLine($"Reflection: {sw.Elapsed}");

        var invoker = LambdaExtensions.GetPropertyValueLambda <Dummy, string>(s1, "Name").Compile();

        sw = Stopwatch.StartNew();
        for (var i = 0; i < Count; i++)
        {
            invoker.Invoke(s1);
        }
        sw.Stop();
        Logger.WriteLine($"Expression: {sw.Elapsed}");
    }
コード例 #9
0
    public void Delegate_Test()
    {
        var test = new Dummy {
            Name = "Test"
        };
        var invoker   = LambdaExtensions.GetPropertyValueLambda <Dummy, string>(test, "Name").Compile();
        var stopWatch = Stopwatch.StartNew();

        for (int i = 0; i < Count; i++)
        {
            invoker(test);
        }
        stopWatch.Stop();
        Logger.WriteLine($"Expression: {stopWatch.Elapsed}");

        var objectType = test.GetType();
        var method     = objectType.GetProperty("Name")?.GetGetMethod(false);

        if (method != null)
        {
            var proxy = (DummyCallback <Dummy>)Delegate.CreateDelegate(typeof(DummyCallback <Dummy>), method);
            stopWatch.Restart();
            for (int i = 0; i < Count; i++)
            {
                proxy(test);
            }
        }
        stopWatch.Stop();
        Logger.WriteLine($"Delegate: {stopWatch.Elapsed}");
    }
コード例 #10
0
        /// <summary>
        /// 调用 OnQuery 回调方法获得数据源
        /// </summary>
        protected async Task QueryData()
        {
            // https://gitee.com/LongbowEnterprise/BootstrapBlazor/issues/I29YK1
            // 选中行目前不支持跨页 原因是选中行实例无法在翻页后保持
            SelectedItems.Clear();

            QueryData <TItem>?queryData = null;
            var queryOption             = new QueryPageOptions()
            {
                IsPage      = IsPagination,
                PageIndex   = PageIndex,
                PageItems   = PageItems,
                SearchText  = SearchText,
                SortOrder   = SortOrder,
                SortName    = SortName,
                Filters     = Filters.Values,
                Searchs     = GetSearchs(),
                SearchModel = SearchModel
            };

            if (OnQueryAsync != null)
            {
                queryData = await OnQueryAsync(queryOption);
            }
            else if (UseInjectDataService)
            {
                queryData = await GetDataService().QueryAsync(queryOption);
            }

            if (queryData != null)
            {
                Items      = queryData.Items;
                TotalCount = queryData.TotalCount;
                IsFiltered = queryData.IsFiltered;
                IsSorted   = queryData.IsSorted;
                IsSearch   = queryData.IsSearch;

                // 外部未过滤,内部自行过滤
                if (!IsFiltered && Filters.Any())
                {
                    Items      = Items.Where(Filters.Values.GetFilterFunc <TItem>());
                    TotalCount = Items.Count();
                }

                // 外部未处理排序,内部自行排序
                if (!IsSorted && SortOrder != SortOrder.Unset && !string.IsNullOrEmpty(SortName))
                {
                    var invoker = SortLambdaCache.GetOrAdd(typeof(TItem), key => LambdaExtensions.GetSortLambda <TItem>().Compile());
                    Items = invoker(Items, SortName, SortOrder);
                }
            }

            if (!IsRendered && SelectedRows != null)
            {
                SelectedItems.AddRange(Items.Where(i => SelectedRows.Contains(i)));
            }
        }
コード例 #11
0
ファイル: ExpressionMapper.cs プロジェクト: Zwedze/Kassandra
        private TOutput MapItem(IResultReader reader)
        {
            TOutput output = Activator.CreateInstance <TOutput>();

            foreach (MappingItem <TOutput> mappingItem in _mappings)
            {
                Expression <Func <TOutput, object> > expression = mappingItem.Expression;
                LambdaExtensions.SetPropertyValue(output, expression, reader.ValueAs(expression.GetExpressionType(), mappingItem.ReaderKey));
            }

            return(output);
        }
コード例 #12
0
    public void ElementCount_Ok()
    {
        var p1 = new List <string>()
        {
            "1", "2"
        };

        Assert.Equal(2, LambdaExtensions.ElementCount(p1));

        var p2 = new string[] { "1", "2" };

        Assert.Equal(2, LambdaExtensions.ElementCount(p2));
    }
コード例 #13
0
        public async Task <ResultDto> GetCities(GetCitiesInput input)
        {
            var expression = LambdaExtensions.CreateExpression <City>();

            if (!string.IsNullOrWhiteSpace(input.Name))
            {
                var andExpression = LambdaExtensions.CreateExpression <City>(o => o.Name.Contains(input.Name));
                expression = LambdaExtensions.AdditionalExpression(expression, andExpression);
            }
            var cities = await _cityManager.FindAsync(expression);

            return(new ResultDto {
                Code = 0, Message = "获取成功!", Data = cities.MapTo <CityDto>()
            });
        }
コード例 #14
0
        /// <summary>
        /// 将直接参数的条件转换成Linq的条件语句, 目前只支持 and 相连
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="sParamWhere">直接条件表达式</param>
        /// <returns></returns>
        public static Expression <Func <T, bool> > ConvertParamWhereToLinq <T>(string sParamWhere)
        {
            if (string.IsNullOrEmpty(sParamWhere))
            {
                return(LambdaExtensions.True <T>());
            }

            Expression <Func <T, bool> > whereLamda = null;

            string[] whereList = sParamWhere.Split(new string[] { " and ", " AND " }, StringSplitOptions.RemoveEmptyEntries);  //分隔
            if (!whereList.Any())
            {
                return(LambdaExtensions.True <T>());
            }

            foreach (var whereDic in whereList)
            {
                string[] where = whereDic.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
                if (where.Length < 3)
                {
                    continue;
                }
                string key        = where[0];
                string expression = where[1];
                string value      = where[2];
                for (int i = 3; i < where.Length; i++)
                {
                    value += " " + where[i].Trim();
                }
                if (whereLamda == null)
                {
                    whereLamda = LambdaExtensions.GetExpressionByString <T>(key, value, expression);
                }
                else
                {
                    //todo 暂时用AlsoAnd
                    whereLamda = whereLamda.And(LambdaExtensions.GetExpressionByString <T>(key, value, expression));
                }
            }
            return(whereLamda ?? LambdaExtensions.False <T>());
        }
コード例 #15
0
        public void SetPropertyValue_Test()
        {
            var dog = new Dog()
            {
                Foo = "test"
            };
            var v1 = LambdaExtensions.SetPropertyValueLambda <Dog, string>(dog, nameof(dog.Foo)).Compile();

            v1.Invoke(dog, "test1");
            Assert.Equal("test1", dog.Foo);

            var cat = new Cat()
            {
                Foo = 1
            };
            var v2 = LambdaExtensions.SetPropertyValueLambda <Cat, int>(cat, nameof(cat.Foo)).Compile();

            v2.Invoke(cat, 2);
            Assert.Equal(2, cat.Foo);

            var fish = new Fish()
            {
                Foo = "test"
            };
            var v3 = LambdaExtensions.SetPropertyValueLambda <Fish, string>(fish, nameof(fish.Foo)).Compile();

            v3.Invoke(fish, "test1");
            Assert.Equal("test1", fish.Foo);

            var persian = new Persian()
            {
                Foo = 1
            };
            var v4 = LambdaExtensions.SetPropertyValueLambda <Persian, int>(persian, nameof(persian.Foo)).Compile();

            v4.Invoke(persian, 2);
            Assert.Equal(2, persian.Foo);
        }
コード例 #16
0
    /// <summary>
    /// 检查 Value 是否合法 返回 true 表示合法
    /// </summary>
    /// <param name="propertyValue"></param>
    protected virtual bool Validate(object?propertyValue)
    {
        var ret = true;

        if (propertyValue != null)
        {
            var type = propertyValue.GetType();
            if (propertyValue is string value)
            {
                var count = SplitCallback(value);
                ret = Validate(count);
            }
            else if (type.IsGenericType || type.IsArray)
            {
                ret = Validate(LambdaExtensions.ElementCount(propertyValue));
            }
        }
        else
        {
            ret = false;
        }
        return(ret);
    }
コード例 #17
0
    public void Sort_Complex()
    {
        var foos = new List <Dummy>
        {
            new() { Foo = new() { Name = "10", Count = 10 } },
            new() { Foo = new() { Name = "10", Count = 20 } },
            new() { Foo = new() { Name = "20", Count = 20 } }
        };
        var orderFoos = LambdaExtensions.Sort(foos, "Foo.Count", SortOrder.Asc);

        Assert.Equal(10, orderFoos.ElementAt(0).Foo !.Count);

        orderFoos = LambdaExtensions.Sort(foos, "Foo.Count", SortOrder.Desc);
        Assert.Equal(20, orderFoos.ElementAt(0).Foo !.Count);

        orderFoos = LambdaExtensions.Sort(foos, "Foo1.Count", SortOrder.Desc);
        Assert.Equal(10, orderFoos.ElementAt(0).Foo !.Count);

        orderFoos = LambdaExtensions.Sort(foos, new List <string>()
        {
            "Foo.Count desc", "Foo.Name"
        });
        Assert.Equal(20, orderFoos.ElementAt(0).Foo !.Count);

        orderFoos = LambdaExtensions.Sort(foos, new List <string>()
        {
            "Foo.Count", "Foo.Name Desc"
        });
        Assert.Equal(10, orderFoos.ElementAt(0).Foo !.Count);

        orderFoos = LambdaExtensions.Sort(foos, new List <string>()
        {
            "Foo.Count", "Foo.Test Desc"
        });
        Assert.Equal(10, orderFoos.ElementAt(0).Foo !.Count);
    }
コード例 #18
0
 /// <summary>
 ///
 /// </summary>
 /// <typeparam name="TType"></typeparam>
 /// <param name="model"></param>
 /// <param name="fieldName"></param>
 /// <returns></returns>
 private EventCallback <TType> CreateCallback <TType>(TModel model, string fieldName)
 {
     return(EventCallback.Factory.Create <TType>(this, t =>
     {
         if (model != null)
         {
             var invoker = SetPropertyValueLambdaCache.GetOrAdd((typeof(TModel), fieldName), key => LambdaExtensions.SetPropertyValueLambda <TModel, object?>(model, key.FieldName).Compile());
             invoker.Invoke(model, t);
         }
コード例 #19
0
        private RenderFragment AutoGenerateTemplate(IEditorItem item) => builder =>
        {
            var fieldType = item.PropertyType;
            if (fieldType != null && Model != null)
            {
                var fieldName = item.GetFieldName();
                // GetDisplayName
                // 先取 Text 属性值,然后取资源文件中的值
                var displayName = item.GetDisplayName() ?? Utility.GetDisplayName(Model, fieldName);

                // FieldValue
                var valueInvoker = GetPropertyValueLambdaCache.GetOrAdd((typeof(TModel), fieldName), key => LambdaExtensions.GetPropertyValueLambda <TModel, object?>(Model, key.FieldName).Compile());
                var fieldValue   = valueInvoker.Invoke(Model);

                // ValueChanged
                var valueChangedInvoker = CreateLambda(fieldType).Compile();
                var fieldValueChanged   = valueChangedInvoker(Model, fieldName);

                // ValueExpression
                var body            = Expression.Property(Expression.Constant(Model), typeof(TModel), fieldName);
                var tDelegate       = typeof(Func <>).MakeGenericType(fieldType);
                var valueExpression = Expression.Lambda(tDelegate, body);

                if (IsDisplay)
                {
                    builder.OpenComponent(0, typeof(Display <>).MakeGenericType(fieldType));
                    builder.AddAttribute(1, "DisplayText", displayName);
                    builder.AddAttribute(2, "Value", fieldValue);
                    builder.AddAttribute(3, "ValueChanged", fieldValueChanged);
                    builder.AddAttribute(4, "ValueExpression", valueExpression);
                    builder.AddAttribute(5, "ShowLabel", ShowLabel ?? true);
                    builder.CloseComponent();
                }
                else
                {
                    var componentType = item.ComponentType ?? EditorForm <TModel> .GenerateComponent(fieldType, item.Rows != 0);

                    builder.OpenComponent(0, componentType);
                    builder.AddAttribute(1, "DisplayText", displayName);
                    builder.AddAttribute(2, "Value", fieldValue);
                    builder.AddAttribute(3, "ValueChanged", fieldValueChanged);
                    builder.AddAttribute(4, "ValueExpression", valueExpression);
                    builder.AddAttribute(5, "IsDisabled", item.Readonly);
                    if (IsCheckboxList(fieldType) && item.Data != null)
                    {
                        builder.AddAttribute(6, nameof(CheckboxList <IEnumerable <string> > .Items), item.Data);
                    }
                    builder.AddMultipleAttributes(7, CreateMultipleAttributes(fieldType, fieldName, item));
                    builder.CloseComponent();
                }
            }
        };
コード例 #20
0
        private RenderFragment AutoGenerateTemplate(IEditorItem item) => builder =>
        {
            var fieldType = item.PropertyType;
            if (fieldType != null && Model != null)
            {
                // GetDisplayName
                var fieldName   = item.GetFieldName();
                var displayName = Utility.GetDisplayName(Model, fieldName);

                // FieldValue
                var valueInvoker = GetPropertyValueLambdaCache.GetOrAdd((typeof(TModel), fieldName), key => LambdaExtensions.GetPropertyValueLambda <TModel, object?>(Model, key.FieldName).Compile());
                var fieldValue   = valueInvoker.Invoke(Model);

                // ValueChanged
                var valueChangedInvoker = CreateLambda(fieldType).Compile();
                var fieldValueChanged   = valueChangedInvoker(Model, fieldName);

                // ValueExpression
                var body            = Expression.Property(Expression.Constant(Model), typeof(TModel), fieldName);
                var tDelegate       = typeof(Func <>).MakeGenericType(fieldType);
                var valueExpression = Expression.Lambda(tDelegate, body);

                var index         = 0;
                var componentType = EditorForm <TModel> .GenerateComponent(fieldType);

                builder.OpenComponent(index++, componentType);
                builder.AddAttribute(index++, "DisplayText", displayName);
                builder.AddAttribute(index++, "Value", fieldValue);
                builder.AddAttribute(index++, "ValueChanged", fieldValueChanged);
                builder.AddAttribute(index++, "ValueExpression", valueExpression);
                builder.AddAttribute(index++, "IsDisabled", item.Readonly);
                builder.AddMultipleAttributes(index++, CreateMultipleAttributes(fieldType, fieldName, item));
                builder.CloseComponent();
            }
        };
コード例 #21
0
        /// <summary>
        /// 调用 OnQuery 回调方法获得数据源
        /// </summary>
        protected async Task QueryData()
        {
            // https://gitee.com/LongbowEnterprise/BootstrapBlazor/issues/I29YK1
            // 选中行目前不支持跨页 原因是选中行实例无法在翻页后保持
            SelectedItems.Clear();

            QueryData <TItem>?queryData = null;
            var queryOption             = new QueryPageOptions()
            {
                IsPage      = IsPagination,
                PageIndex   = PageIndex,
                PageItems   = PageItems,
                SearchText  = SearchText,
                SortOrder   = SortOrder,
                SortName    = SortName,
                Filters     = Filters.Values,
                Searchs     = GetSearchs(),
                SearchModel = SearchModel
            };

            if (OnQueryAsync != null)
            {
                queryData = await OnQueryAsync(queryOption);
            }
            else if (UseInjectDataService)
            {
                queryData = await GetDataService().QueryAsync(queryOption);
            }

            if (queryData != null)
            {
                Items = queryData.Items;
                if (IsTree)
                {
                    KeySet.Clear();
                    if (TableTreeNode <TItem> .HasKey)
                    {
                        CheckExpandKeys(TreeRows);
                    }
                    if (KeySet.Count > 0)
                    {
                        TreeRows = new List <TableTreeNode <TItem> >();
                        foreach (var item in Items)
                        {
                            var node = new TableTreeNode <TItem>(item)
                            {
                                HasChildren = CheckTreeChildren(item),
                            };
                            node.IsExpand = node.HasChildren && node.Key != null && KeySet.Contains(node.Key);
                            if (node.IsExpand)
                            {
                                await RestoreIsExpand(node);
                            }
                            TreeRows.Add(node);
                        }
                    }
                    else
                    {
                        TreeRows = Items.Select(item => new TableTreeNode <TItem>(item)
                        {
                            HasChildren = CheckTreeChildren(item)
                        }).ToList();
                    }
                }
                TotalCount = queryData.TotalCount;
                IsFiltered = queryData.IsFiltered;
                IsSorted   = queryData.IsSorted;
                IsSearch   = queryData.IsSearch;

                // 外部未过滤,内部自行过滤
                if (!IsFiltered && Filters.Any())
                {
                    Items      = Items.Where(Filters.Values.GetFilterFunc <TItem>());
                    TotalCount = Items.Count();
                }

                // 外部未处理排序,内部自行排序
                if (!IsSorted && SortOrder != SortOrder.Unset && !string.IsNullOrEmpty(SortName))
                {
                    var invoker = SortLambdaCache.GetOrAdd(typeof(TItem), key => LambdaExtensions.GetSortLambda <TItem>().Compile());
                    Items = invoker(Items, SortName, SortOrder);
                }
            }

            if (SelectedRows != null)
            {
                SelectedItems.AddRange(Items.Where(i => SelectedRows.Contains(i)));
            }
        }
コード例 #22
0
 public static Action <T, int> ForEach <T>(this Action <T, int> e, IEnumerable <T> s)
 {
     LambdaExtensions.ForEach(s, e);
     return(e);
 }