动态构造 lambda

来源:互联网 发布:苏格兰折耳猫 知乎 编辑:程序博客网 时间:2024/06/01 09:38

  Type type = obj.GetType();
            var property = type.GetProperty(keyName);
            object keyValue = property.GetValue(obj, null);

            //Expression<Func<DataBase.NewsSystem, bool>> filter = x => x.NSiD == "F3A918C0-FC41-4AA2-8A6C-5E4BB4A20EC2";
            var paramExpr = Expression.Parameter(typeof(T), "x");
            MemberExpression namePropExpr = Expression.Property(paramExpr, keyName);
            // 获取表示System.String.Equals方法的System.Reflection.MethodInfo
            MethodInfo EqualsMethod = pk.First().Type.GetMethod("Equals", new Type[] { pk.First().Type });

            // 创建表示value变量值的表达式
            ConstantExpression nameValueExpr = Expression.Constant(keyValue, pk.First().Type);
            // 创建表示name参数的表达式
            MethodCallExpression nameContainsExpr = Expression.Call(namePropExpr, EqualsMethod, nameValueExpr);
            //var paramRight = Expression.Parameter(typeof(string), "F3A918C0");
            //Expression body = Expression.Equal(
            var lambda = Expression.Lambda<Func<T, bool>>(nameContainsExpr, paramExpr);
            var filter = lambda.Compile();

            T updatedObj = Context.GetTable<T>().Single(filter);
            SetValue<T>(ref updatedObj, obj);

原创粉丝点击