protected LambdaExpression UpdateLambda(LambdaExpression lambda, Type delegateType, Expression body, IEnumerable<ParameterExpression> parameters)
 {
     if (body != lambda.Body || parameters != lambda.Parameters || delegateType != lambda.Type)
     {
         return Expression.Lambda(delegateType, body, parameters);
     }
     return lambda;
 }
			public override void VisitLambdaExpression (LambdaExpression lambdaExpression)
			{
				var blockStatement = lambdaExpression.Body as BlockStatement;
				if (blockStatement != null)
					StatementIssueCollector.Collect (this, blockStatement);

				base.VisitLambdaExpression (lambdaExpression);
			}
示例#3
0
        internal LightDelegateCreator(Interpreter interpreter, LambdaExpression lambda)
        {
            Debug.Assert(interpreter != null);
            Debug.Assert(lambda != null);

            Interpreter = interpreter;
            _lambda = lambda;
        }
示例#4
0
		public static Delegate Compile (LambdaExpression lambda, DebugInfoGenerator debugInfoGenerator)
		{
#if MONO_INTERPRETER
			return lambda.LightCompile ();
#else			
			throw new NotSupportedException ("System.Linq.Expression interpreter is missing");
#endif
		}
		public LocalLookupVariable(string name, TypeReference typeRef, Location startPos, Location endPos, bool isConst, bool isLoopVariable, Expression initializer, LambdaExpression parentLambdaExpression)
		{
			Name = name;
			TypeRef = typeRef;
			StartPos = startPos;
			EndPos = endPos;
			IsConst = isConst;
			IsLoopVariable = isLoopVariable;
			Initializer = initializer;
			ParentLambdaExpression = parentLambdaExpression;
		}
示例#6
0
        public override void ExtendDeclaration(IDeclarationModel declaration, CompilationModel model)
        {
            // this only applies to methods
            var methodDecl = declaration as MethodDeclaration;
            if (methodDecl == null || methodDecl.Container == null)
                return;

            if (!methodDecl.Definition.Symbol.IsExtensionMethod)
                throw new CompilationException("The ScriptMixin attribute can only be applied to extension methods.", declaration);

            // remove the function from the container
            methodDecl.Container.RemoveMember(methodDecl);

            // get the extension target info
            var extTarget = methodDecl.Parameters[0];
            var extType = extTarget.Definition.Type;

            // rewrite first param as a local declaration to this context
            var thisDecl = new LocalDeclarationStatement { VariableDeclaration = new VariableDeclaration() };
            thisDecl.VariableDeclaration.Variables.Add(new VariableDeclarator
            {
                Definition = new LocalDefinition
                {
                    Name = extTarget.Name,
                    Type = extType
                },
                EqualsValueExpression = new LiteralExpression { Text = "this" }
            });

            // add the declaration to the method body
            methodDecl.Body.Statements.Insert(0, thisDecl);

            // create a lambda using the method body.
            var lambdaExpression = new LambdaExpression();
            lambdaExpression.Body = methodDecl.Body;

            for (int i = 1; i < methodDecl.Parameters.Count; i++)
                lambdaExpression.Parameters.Add(methodDecl.Parameters[i]);

            // create a global statement to set the prototype value
            var target = extType.GetFullName() + ".prototype." + methodDecl.Definition.Name;

            model.GlobalStatements.Add(new ExpressionStatement
            {
                Expression = new BinaryExpression
                {
                    LeftExpression = new LiteralExpression { Text = target },
                    RightExpression = lambdaExpression,
                    Operator = "="
                }
            });
        }
示例#7
0
		public static IType GetLambdaReturnType(RefactoringContext context, LambdaExpression lambda)
		{
			LambdaResolveResult rr = context.Resolve(lambda) as LambdaResolveResult;
			if (rr == null)
				return SpecialType.UnknownType;
			if (rr.IsAsync) {
				// Unpack Task<T>
				if (rr.ReturnType.IsKnownType(KnownTypeCode.Task))
					return context.Compilation.FindType(KnownTypeCode.Void);
				else if (rr.ReturnType.IsKnownType(KnownTypeCode.TaskOfT) && rr.ReturnType.IsParameterized)
					return rr.ReturnType.TypeArguments[0];
			}
			return rr.ReturnType;
		}
		public override void VisitLambdaExpression(LambdaExpression lambdaExpression)
		{
			foreach (var param in lambdaExpression.Parameters) {
				var result = context.Resolve(param);
				var local = result as LocalResolveResult;
				anonymousParameters.Add(local.Variable); 
			}
			base.VisitLambdaExpression(lambdaExpression);
			foreach (var param in lambdaExpression.Parameters) {
				var result = context.Resolve(param);
				var local = result as LocalResolveResult;
				anonymousParameters.Remove(local.Variable); 
			}
		}
		public void AddVariable(TypeReference typeRef, string name,
		                        Location startPos, Location endPos, bool isConst,
		                        bool isLoopVariable, Expression initializer,
		                        LambdaExpression parentLambdaExpression)
		{
			if (name == null || name.Length == 0) {
				return;
			}
			List<LocalLookupVariable> list;
			if (!variables.ContainsKey(name)) {
				variables[name] = list = new List<LocalLookupVariable>();
			} else {
				list = (List<LocalLookupVariable>)variables[name];
			}
			list.Add(new LocalLookupVariable(name, typeRef, startPos, endPos, isConst, isLoopVariable, initializer, parentLambdaExpression));
		}
		public override void VisitLambdaExpression(LambdaExpression lambdaExpression) {
			AstNode oldMethod = _currentMethod;
			bool oldIsInsideLoop = _isInsideLoop;
			try {
				_currentMethod = lambdaExpression;
				_isInsideLoop = false;

				foreach (var p in lambdaExpression.Parameters)
					AddVariable(p, p.Name, p.ParameterModifier == ParameterModifier.Out || p.ParameterModifier == ParameterModifier.Ref);

				base.VisitLambdaExpression(lambdaExpression);
			}
			finally {
				_currentMethod = oldMethod;
				_isInsideLoop = oldIsInsideLoop;
			}
		}
		public static IType GetLambdaReturnType(RefactoringContext context, LambdaExpression lambda)
		{
			var parent = lambda.Parent;
			while (parent is ParenthesizedExpression)
				parent = parent.Parent;

			ITypeDefinition delegateTypeDef;
			if (parent is InvocationExpression) {
				var invocation = (InvocationExpression)parent;
				var argIndex = invocation.Arguments.TakeWhile (arg => !arg.Contains (lambda.StartLocation)).Count ();
				var resolveResult = (CSharpInvocationResolveResult)context.Resolve (invocation);
				delegateTypeDef = resolveResult.Arguments [argIndex].Type.GetDefinition ();
			} else {
				delegateTypeDef = context.Resolve (parent).Type.GetDefinition ();
			}
			if (delegateTypeDef == null)
				return null;
			var invokeMethod = delegateTypeDef.GetMethods (m => m.Name == "Invoke").FirstOrDefault ();
			if (invokeMethod == null)
				return null;
			return invokeMethod.ReturnType;
		}
		public override IEnumerable<CodeAction> GetActions(RefactoringContext context)
		{
			Expression node = context.GetNode<IdentifierExpression>();
			if (node == null) {
				var mr = context.GetNode<MemberReferenceExpression>();
				if (mr == null || !mr.MemberNameToken.IsInside(context.Location))
					yield break;
				node = mr;
			}
			if (node == null)
				yield break;
			var rr = context.Resolve(node) as MethodGroupResolveResult;
			if (rr == null || rr.IsError)
				yield break;
			var type = TypeGuessing.GetValidTypes(context.Resolver, node).FirstOrDefault(t => t.Kind == TypeKind.Delegate);
			if (type == null)
				yield break;
			var invocationMethod = type.GetDelegateInvokeMethod();
			if (invocationMethod == null)
				yield break;

			yield return new CodeAction(
				context.TranslateString("Convert to lambda expression"), 
				script => {
					var invocation = new InvocationExpression(node.Clone(), invocationMethod.Parameters.Select(p => new IdentifierExpression(context.GetNameProposal(p.Name))));
					var lambda = new LambdaExpression {
						Body = invocation
					};
					lambda.Parameters.AddRange(
						invocation.Arguments
							.Cast<IdentifierExpression>()
							.Select(p => new ParameterDeclaration { Name = p.Identifier })
					);
					script.Replace(node, lambda);
				},
				node
			);
		}
示例#13
0
 public static EF_DataTypes Fetch(int page, int rowCount, System.Linq.Expressions.Expression <Func <EF_DataType, bool> > exp, params object[] values)
 {
     return(EF.DataPortal.Fetch <EF_DataTypes>(new PagigExpress {
         Page = page, RowCount = rowCount, Lambda = LambdaExpression.Create <EF_DataType>(exp, values)
     }));
 }
示例#14
0
        // 创建 DELETE 命令
        protected override Command ResolveDeleteCommand <T>(DbQueryableInfo_Delete <T> dbQuery, ResolveToken token)
        {
            ISqlBuilder     builder     = this.CreateSqlBuilder(token);
            TypeRuntimeInfo typeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo <T>();

            builder.Append("DELETE FROM ");
            builder.AppendMember(typeRuntime.TableName, !typeRuntime.IsTemporary);
            builder.Append(" ");

            if (dbQuery.Entity != null)
            {
                if (typeRuntime.KeyInvokers == null || typeRuntime.KeyInvokers.Count == 0)
                {
                    throw new XFrameworkException("Delete<T>(T value) require entity must have key column.");
                }

                object entity = dbQuery.Entity;

                builder.AppendNewLine();
                builder.Append("WHERE ");

                foreach (var invoker in typeRuntime.KeyInvokers)
                {
                    var column = invoker.Column;
                    var value  = invoker.Invoke(entity);
                    var seg    = this.DbValue.GetSqlValue(value, token, column);

                    builder.AppendMember(invoker.Member.Name);
                    builder.Append(" = ");
                    builder.Append(seg);
                    builder.Append(" AND ");
                }
                builder.Length -= 5;
            }
            else if (dbQuery.SelectInfo != null)
            {
                LambdaExpression lambda = null;
                var sourceQuery         = dbQuery.SourceQuery;
                if (sourceQuery.DbExpressions != null && sourceQuery.DbExpressions.Count > 1)
                {
                    switch (sourceQuery.DbExpressions[1].DbExpressionType)
                    {
                    case DbExpressionType.Join:
                    case DbExpressionType.GroupJoin:
                    case DbExpressionType.GroupRightJoin:
                        lambda = (LambdaExpression)sourceQuery.DbExpressions[1].Expressions[1];
                        break;

                    case DbExpressionType.Select:
                    case DbExpressionType.SelectMany:
                        lambda = (LambdaExpression)sourceQuery.DbExpressions[1].Expressions[0];
                        break;
                    }
                }
                if (lambda == null)
                {
                    DbExpression dbExpression = dbQuery.SelectInfo.Select;
                    dbExpression = dbQuery.SelectInfo.Condtion;
                    if (dbExpression != null && dbExpression.Expressions != null)
                    {
                        lambda = (LambdaExpression)dbExpression.Expressions[0];
                    }
                }

                // 解析查询以确定是否需要嵌套
                var parameter  = Expression.Parameter(typeof(SQLiteRowId), lambda != null ? lambda.Parameters[0].Name : "x");
                var expression = Expression.MakeMemberAccess(parameter, (_rowIdExpression.Body as MemberExpression).Member);
                dbQuery.SelectInfo.Select = new DbExpression(DbExpressionType.Select, expression);
                var cmd = (MapperCommand)this.ResolveSelectCommand <T>(dbQuery.SelectInfo, 1, false, null);
                if (token != null && token.Extendsions == null)
                {
                    token.Extendsions = new Dictionary <string, object>();
                    if (!token.Extendsions.ContainsKey("SQLiteDelete"))
                    {
                        token.Extendsions.Add("SQLiteDelete", null);
                    }
                }

                if ((cmd.NavMembers != null && cmd.NavMembers.Count > 0) || dbQuery.SelectInfo.Joins.Count > 0)
                {
                    cmd = (MapperCommand)this.ResolveSelectCommand <T>(dbQuery.SelectInfo, 1, false, token);
                    builder.Append("WHERE ");
                    builder.AppendMember("RowID");
                    builder.Append(" IN(");
                    builder.AppendNewLine(cmd.CommandText);
                    builder.Append(')');
                }
                else
                {
                    TableAliasCache       aliases = this.PrepareTableAlias <T>(dbQuery.SelectInfo, token);
                    ExpressionVisitorBase visitor = null;

                    visitor = new JoinExpressionVisitor(this, aliases, dbQuery.SelectInfo.Joins);
                    visitor.Write(builder);

                    visitor = new WhereExpressionVisitor(this, null, dbQuery.SelectInfo.Condtion);
                    visitor.Write(builder);
                }
            }

            builder.Append(';');
            return(new Command(builder.ToString(), builder.Token != null ? builder.Token.Parameters : null, System.Data.CommandType.Text));
        }
示例#15
0
文件: EvtxTypeMap.cs 项目: xornand/Tx
        public Func <EventRecord, object> GetTransform(Type outputType)
        {
            Expression <Func <EventRecord, SystemEvent> > template = e => new SystemEvent
            {
                Header = new SystemHeader
                {
                    ActivityId        = e.ActivityId.HasValue ? e.ActivityId.Value : Guid.Empty,
                    Channel           = 0,
                    Context           = e.LogName,
                    Level             = e.Level.Value,
                    EventId           = (ushort)e.Id,
                    Keywords          = e.Keywords.HasValue ? (ulong)e.Keywords.Value : (ulong)0,
                    Opcode            = e.Opcode.HasValue ? (byte)e.Opcode.Value : (byte)0,
                    ProcessId         = e.ProcessId.HasValue ? (uint)e.ProcessId.Value : 0,
                    ProviderId        = e.ProviderId.HasValue ? e.ProviderId.Value : Guid.Empty,
                    RelatedActivityId = e.RelatedActivityId.HasValue ? e.RelatedActivityId.Value : Guid.Empty,
                    Task      = e.Task.HasValue ? (ushort)e.Task.Value : (ushort)0,
                    ThreadId  = e.ThreadId.HasValue ? (uint)e.ThreadId.Value : (uint)0,
                    Timestamp = e.TimeCreated.HasValue ? e.TimeCreated.Value : DateTime.MinValue,
                    Version   = e.Version.HasValue ? e.Version.Value : (byte)0
                }
            };

            if (outputType == typeof(SystemEvent))
            {
                return(template.Compile());
            }

            LambdaExpression ex = template;
            var mi       = (MemberInitExpression)ex.Body;
            var bindings = new List <MemberBinding>(mi.Bindings);
            ParameterExpression record = ex.Parameters[0];

            PropertyInfo[] properties = outputType.GetProperties();
            int            index      = 0;

            foreach (PropertyInfo p in properties)
            {
                var attribute = p.GetAttribute <EventFieldAttribute>();
                if (attribute == null)
                {
                    continue;
                }

                // the following is to handle value maps, that were emitted as enumerations
                Type t;
                if (p.PropertyType.IsEnum)
                {
                    t = p.PropertyType;
                }
                else
                {
                    t = GetSimpleType(attribute.OriginalType);
                }

                MemberAssignment b = Expression.Bind(p, Expression.Convert(
                                                         Expression.Property(
                                                             Expression.Call(
                                                                 Expression.Property(record,
                                                                                     typeof(EventRecord).GetProperty(
                                                                                         "Properties")),
                                                                 typeof(IList <EventProperty>).GetMethod("get_Item"),
                                                                 Expression.Constant(index++)),
                                                             typeof(EventProperty).GetProperty("Value")),
                                                         t));

                bindings.Add(b);
            }

            NewExpression        n    = Expression.New(outputType);
            MemberInitExpression m    = Expression.MemberInit(n, bindings.ToArray());
            UnaryExpression      cast = Expression.Convert(m, typeof(object));
            Expression <Func <EventRecord, object> > exp = Expression.Lambda <Func <EventRecord, object> >(cast, ex.Parameters);

            return(exp.Compile());
        }
示例#16
0
 public ActivationExpression(LambdaExpression expression, Func <Tuple, TResult> compiledExpression, IArgumentMap argumentMap)
 {
     _expression         = expression;
     _compiledExpression = compiledExpression;
     _argumentMap        = argumentMap;
 }
示例#17
0
        /// <summary>
        /// Create istance of MvbBindable on this Binder
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="TK"></typeparam>
        /// <param name="property"></param>
        /// <param name="newIstance"></param>
        public void SetMvbBindableInstance <T, TK>(Expression <Func <T, TK> > property, Func <TK> newIstance) where T : MvbBase where TK : IMvbBindable
        {
            var bindableInstance = newIstance.Invoke();

            var propertyTree = new Queue <string>();

            #region PROPERTY TREE

            LambdaExpression lambda = property;
            MemberExpression memberExpression;

            if (lambda.Body is UnaryExpression)
            {
                var unaryExpression = (UnaryExpression)lambda.Body;
                memberExpression = (MemberExpression)unaryExpression.Operand;
            }
            else
            {
                memberExpression = (MemberExpression)lambda.Body;
            }

            //Check composite ex binder.MyObject.MyProperty => MyObject.MyProperty
            var propName     = ((PropertyInfo)memberExpression.Member).Name;
            var body         = lambda.Body.ToString();
            var bodySplitted = body.Split('.');
            var isComposite  = bodySplitted.Length > 2;

            if (!isComposite)
            {
                propertyTree.Enqueue(propName);
            }
            else
            {
                var splittedlist = bodySplitted.ToList();
                splittedlist.RemoveAt(0);
                foreach (var s in splittedlist)
                {
                    propertyTree.Enqueue(s);
                }
            }
            var theDeepProperty = string.Join(".", propertyTree);

            #endregion

            var vmtype = this._vmInstance.GetType();
            if (vmtype != typeof(T))
            {
                throw new Exception($"Wrong type instance. instance must be of type: {vmtype}");
            }

            PropertyInfo propertyOnObj = null;
            object       lastParent    = this._vmInstance;

            while (propertyTree.Any())
            {
                var propertyName   = propertyTree.Dequeue();
                var parentTypeInfo = lastParent.GetType().GetTypeInfo();

                propertyOnObj = parentTypeInfo.DeclaredProperties.Single(s => s.Name == propertyName);

                if (propertyTree.Count > 0)
                {
                    lastParent = propertyOnObj.GetValue(lastParent);
                }
            }


            if (propertyOnObj == null)
            {
                throw new Exception("Deep property not found!");
            }

            var oldObj = propertyOnObj.GetValue(lastParent, null) as IMvbBindable;


            // Clear and Active PropertyChanged
            //Clear ols handler
            oldObj?.ClearHandler();

            //set new object
            propertyOnObj.SetValue(lastParent, bindableInstance);

            //Active PropertyChanged if not null
            if (bindableInstance == null)
            {
                return;
            }

            bindableInstance.PropertyChanged += (sender, args) =>
            {
                var registerName = $"{theDeepProperty}.{args.PropertyName}";
                this.Run(registerName);
            };

            //Activate sub collections
            this.ActiveListenerOnObservableCollection(bindableInstance, propertyOnObj.Name);
        }
示例#18
0
        public static HR_EmpPositionBill Fetch(System.Linq.Expressions.Expression <Func <HR_EmpPositionBill, bool> > exp, params object[] values)
        {
            LambdaExpression lambda = LambdaExpression.Create <HR_EmpPositionBill>(exp, values);

            return(EF.DataPortal.Fetch <HR_EmpPositionBill>(lambda));
        }
示例#19
0
        public static PM_AllotModSubs Fetch(System.Linq.Expressions.Expression <Func <PM_AllotModSub, bool> > exp, params object[] values)
        {
            LambdaExpression lambda = LambdaExpression.Create <PM_AllotModSub>(exp, values);

            return(EF.DataPortal.Fetch <PM_AllotModSubs>(lambda));
        }
 protected override ShapedQueryExpression?TranslateThenBy(
     ShapedQueryExpression source,
     LambdaExpression keySelector,
     bool ascending)
 => null;
 protected override ShapedQueryExpression?TranslateAverage(
     ShapedQueryExpression source,
     LambdaExpression selector,
     Type resultType)
 => null;
 protected override ShapedQueryExpression?TranslateLastOrDefault(
     ShapedQueryExpression source,
     LambdaExpression predicate,
     Type returnType,
     bool returnDefault)
 => null;
 protected override ShapedQueryExpression?TranslateSelectMany(
     ShapedQueryExpression source,
     LambdaExpression selector)
 => null;
 protected override ShapedQueryExpression?TranslateGroupBy(
     ShapedQueryExpression source,
     LambdaExpression keySelector,
     LambdaExpression elementSelector,
     LambdaExpression resultSelector)
 => null;
示例#25
0
 public void SetSelect(LambdaExpression selectExpression)
 {
     Select = selectExpression;
 }
示例#26
0
        public static LambdaExpression CombineCollectionPropertySelectorWithPredicate(LambdaExpression propertySelector, LambdaExpression propertyPredicate, CollectionBehavior collectionBehavior = CollectionBehavior.All)
        {
            // x => ids.Contains(x.Id)
            // x => Collection.Any(ids.Contains(x.Id))
            var memberExpression = propertySelector.Body as MemberExpression;
            var propertyInfo     = ((PropertyInfo)memberExpression.Member);
            var containingType   = propertyInfo.DeclaringType;

            if (memberExpression == null)
            {
                throw new ArgumentException("propertySelector");
            }
            var        rootPredicateType = typeof(Func <,>).GetGenericTypeDefinition().MakeGenericType(containingType, typeof(bool));
            MethodInfo filterMethodInfo;

            if (collectionBehavior == CollectionBehavior.All)
            {
                filterMethodInfo = typeof(Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public).Single(mi => mi.Name == "All" && mi.GetParameters().Count() == 2).MakeGenericMethod(propertyInfo.PropertyType.ToSingleType());
            }
            else
            {
                filterMethodInfo = typeof(Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public).Single(mi => mi.Name == "Any" && mi.GetParameters().Count() == 2).MakeGenericMethod(propertyInfo.PropertyType.ToSingleType());
            }
            var collectionCall = Expression.Call(null, filterMethodInfo, memberExpression, propertyPredicate);

            return(Expression.Lambda(rootPredicateType, collectionCall, propertySelector.Parameters));
        }
示例#27
0
文件: linq.cs 项目: alisci01/mono
		protected virtual void CreateArguments (ResolveContext ec, Parameter parameter, ref Arguments args)
		{
			args = new Arguments (2);

			LambdaExpression selector = new LambdaExpression (loc);

			block.SetParameter (parameter);
			selector.Block = block;
			selector.Block.AddStatement (new ContextualReturn (expr));

			args.Add (new Argument (selector));
		}
示例#28
0
 /// <summary>
 /// Creates a <see cref="BinaryExpression"/> that represents raising an expression to a power and assigning the result back to the expression.
 /// </summary>
 /// <param name="left">An <see cref="Expression"/> to set the <see cref="P:BinaryExpression.Left"/> property equal to.</param>
 /// <param name="right">An <see cref="Expression"/> to set the <see cref="P:BinaryExpression.Right"/> property equal to.</param>
 /// <param name="method">A <see cref="MethodInfo"/> to set the <see cref="P:BinaryExpression.Method"/> property equal to.</param>
 /// <param name="conversion">A <see cref="LambdaExpression"/> to set the <see cref="P:BinaryExpression.Conversion"/> property equal to.</param>
 /// <returns>A <see cref="BinaryExpression"/> that has the <see cref="P:Expression.NodeType"/> property equal to <see cref="F:ExpressionType.PowerAssign"/> 
 /// and the <see cref="P:BinaryExpression.Left"/>, <see cref="P:BinaryExpression.Right"/>, <see cref="P:BinaryExpression.Method"/>,
 /// and <see cref="P:BinaryExpression.Conversion"/> properties set to the specified values.
 /// </returns>
 public static BinaryExpression PowerAssign(Expression left, Expression right, MethodInfo method, LambdaExpression conversion) {
     RequiresCanRead(left, "left");
     RequiresCanWrite(left, "left");
     RequiresCanRead(right, "right");
     if (method == null) {
         Type mathType = typeof(System.Math);
         method = mathType.GetMethod("Pow", BindingFlags.Static | BindingFlags.Public);
         if (method == null) {
             throw Error.BinaryOperatorNotDefined(ExpressionType.PowerAssign, left.Type, right.Type);
         }
     }
     return GetMethodBasedAssignOperator(ExpressionType.PowerAssign, left, right, method, conversion, true);
 }
示例#29
0
文件: linq.cs 项目: alisci01/mono
		protected override void CreateArguments (ResolveContext ec, Parameter parameter, ref Arguments args)
		{
			args = new Arguments (4);

			if (IdentifierType != null)
				expr = CreateCastExpression (expr);

			args.Add (new Argument (expr));

			outer_selector.SetParameter (parameter.Clone ());
			var lambda = new LambdaExpression (outer_selector.StartLocation);
			lambda.Block = outer_selector;
			args.Add (new Argument (lambda));

			inner_selector.SetParameter (new ImplicitLambdaParameter (identifier.Name, identifier.Location));
			lambda = new LambdaExpression (inner_selector.StartLocation);
			lambda.Block = inner_selector;
			args.Add (new Argument (lambda));

			base.CreateArguments (ec, parameter, ref args);
		}
示例#30
0
 internal CoalesceConversionBinaryExpression(Expression left, Expression right, LambdaExpression conversion)
     : base(left, right) {
     _conversion = conversion;
 }
示例#31
0
 public static PM_AllotModSubs Fetch(int page, int rowCount, System.Linq.Expressions.Expression <Func <PM_AllotModSub, bool> > exp, params object[] values)
 {
     return(EF.DataPortal.Fetch <PM_AllotModSubs>(new PagigExpress {
         Page = page, RowCount = rowCount, Lambda = LambdaExpression.Create <PM_AllotModSub>(exp, values)
     }));
 }
示例#32
0
 private static BinaryExpression GetUserDefinedAssignOperatorOrThrow(ExpressionType binaryType, string name, Expression left, Expression right, LambdaExpression conversion, bool liftToNull) {
     BinaryExpression b = GetUserDefinedBinaryOperatorOrThrow(binaryType, name, left, right, liftToNull);
     if (conversion == null) {
         // return type must be assignable back to the left type
         if (!TypeUtils.AreReferenceAssignable(left.Type, b.Type)) {
             throw Error.UserDefinedOpMustHaveValidReturnType(binaryType, b.Method.Name);
         }
     } else {
         // add the conversion to the result
         ValidateOpAssignConversionLambda(conversion, b.Left, b.Method, b.NodeType);
         b = new OpAssignMethodConversionBinaryExpression(b.NodeType, b.Left, b.Right, b.Left.Type, b.Method, conversion);
     }
     return b;
 }
示例#33
0
 public override void VisitLambdaExpression(LambdaExpression lambdaExpression)
 {
     new LambdaBlock(this, lambdaExpression).Emit();
 }
 // LambdaExpression
 public override bool Walk(LambdaExpression node) { return false; }
示例#35
0
 public override void VisitLambdaExpression(LambdaExpression lambdaExpression)
 {
     // ignore lambdas
 }
 // LambdaExpression
 public virtual bool Walk(LambdaExpression node) { return true; }
示例#37
0
        // 创建 UPDATE 命令
        protected override Command ResolveUpdateCommand <T>(DbQueryableInfo_Update <T> dbQuery, ResolveToken token)
        {
            ISqlBuilder builder     = this.CreateSqlBuilder(token);
            var         typeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo <T>();

            builder.Append("UPDATE ");
            builder.AppendMember(typeRuntime.TableName, !typeRuntime.IsTemporary);
            builder.Append(" SET");
            builder.AppendNewLine();

            if (dbQuery.Entity != null)
            {
                object      entity       = dbQuery.Entity;
                ISqlBuilder whereBuilder = this.CreateSqlBuilder(token);
                bool        useKey       = false;
                int         length       = 0;

                foreach (var invoker in typeRuntime.Invokers)
                {
                    var column = invoker.Column;
                    if (column != null && column.IsIdentity)
                    {
                        goto gotoLabel;                                      // fix issue# 自增列同时又是主键
                    }
                    if (column != null && column.NoMapped)
                    {
                        continue;
                    }
                    if (invoker.Column != null && column.DbType is SqlDbType && (SqlDbType)column.DbType == SqlDbType.Timestamp)
                    {
                        continue;                                                                                                          // 行版本号
                    }
                    if (invoker.ForeignKey != null)
                    {
                        continue;
                    }
                    if (invoker.Member.MemberType == System.Reflection.MemberTypes.Method)
                    {
                        continue;
                    }

                    builder.AppendMember(invoker.Member.Name);
                    builder.Append(" = ");

gotoLabel:
                    var value = invoker.Invoke(entity);
                    var seg = this.DbValue.GetSqlValueWidthDefault(value, token, column);

                    if (column == null || !column.IsIdentity)
                    {
                        builder.Append(seg);
                        length = builder.Length;
                        builder.Append(',');
                        builder.AppendNewLine();
                    }

                    if (column != null && column.IsKey)
                    {
                        useKey = true;
                        whereBuilder.AppendMember(invoker.Member.Name);
                        whereBuilder.Append(" = ");
                        whereBuilder.Append(seg);
                        whereBuilder.Append(" AND ");
                    }
                }

                if (!useKey)
                {
                    throw new XFrameworkException("Update<T>(T value) require entity must have key column.");
                }

                builder.Length       = length;
                whereBuilder.Length -= 5;

                builder.AppendNewLine();
                builder.Append("WHERE ");
                builder.Append(whereBuilder);
            }
            else if (dbQuery.Expression != null)
            {
                // SELECT 表达式
                LambdaExpression lambda = dbQuery.Expression as LambdaExpression;
                var        body         = lambda.Body;
                Expression expression   = null;
                if (body.NodeType == ExpressionType.MemberInit)
                {
                    var memberInit = body as MemberInitExpression;
                    var bindings   = new List <MemberBinding>(memberInit.Bindings);
                    foreach (var invoker in typeRuntime.KeyInvokers)
                    {
                        var member  = Expression.MakeMemberAccess(lambda.Parameters[0], invoker.Member);
                        var binding = Expression.Bind(invoker.Member, member);
                        if (!bindings.Any(x => x.Member == invoker.Member))
                        {
                            bindings.Add(binding);
                        }
                    }
                    expression = Expression.MemberInit(memberInit.NewExpression, bindings);
                }
                else if (body.NodeType == ExpressionType.New)
                {
                    var newExpression = body as NewExpression;
                    var bindings      = new List <MemberBinding>();
                    for (int i = 0; i < newExpression.Members.Count; i++)
                    {
                        var invoker = typeRuntime.GetInvoker(newExpression.Members[i].Name);
                        var binding = Expression.Bind(invoker.Member, newExpression.Arguments[i].Type != invoker.DataType
                            ? Expression.Convert(newExpression.Arguments[i], invoker.DataType)
                            : newExpression.Arguments[i]);
                        bindings.Add(binding);
                    }

                    foreach (var invoker in typeRuntime.KeyInvokers)
                    {
                        var member  = Expression.MakeMemberAccess(lambda.Parameters[0], invoker.Member);
                        var binding = Expression.Bind(invoker.Member, member);
                        if (!bindings.Any(x => x.Member == invoker.Member))
                        {
                            bindings.Add(binding);
                        }
                    }

                    var newExpression2 = Expression.New(typeRuntime.ConstructInvoker.Constructor);
                    expression = Expression.MemberInit(newExpression2, bindings);
                }

                // 解析查询以确定是否需要嵌套
                dbQuery.SelectInfo.Select = new DbExpression(DbExpressionType.Select, expression);
                var cmd = (MapperCommand)this.ResolveSelectCommand <T>(dbQuery.SelectInfo, 1, false, null);

                if ((cmd.NavMembers != null && cmd.NavMembers.Count > 0) || dbQuery.SelectInfo.Joins.Count > 0)
                {
                    if (typeRuntime.KeyInvokers == null || typeRuntime.KeyInvokers.Count == 0)
                    {
                        throw new XFrameworkException("Update<T>(Expression<Func<T, object>> updateExpression) require entity must have key column.");
                    }

                    // SET 字段
                    var visitor = new SQLiteUpdateExpressionVisitor <T>(this, null, dbQuery, null);
                    visitor.ParseCommand = this.ResolveSelectCommand;
                    visitor.Write(builder);

                    // WHERE部分
                    builder.AppendNewLine();
                    builder.Append("WHERE EXISTS");
                    visitor.VisitArgument(dbQuery.SelectInfo.Select.Expressions[0], true);
                }
                else
                {
                    // 直接 SQL 的 UPDATE 语法
                    TableAliasCache aliases = this.PrepareTableAlias <T>(dbQuery.SelectInfo, token);
                    var             visitor = new SQLiteUpdateExpressionVisitor <T>(this, aliases, dbQuery, null);
                    visitor.ParseCommand = this.ResolveSelectCommand;
                    visitor.Write(builder);

                    var visitor2 = new WhereExpressionVisitor(this, null, dbQuery.SelectInfo.Condtion);
                    visitor2.Write(builder);
                }
            }

            builder.Append(';');
            return(new Command(builder.ToString(), builder.Token != null ? builder.Token.Parameters : null, System.Data.CommandType.Text));
        }
		public virtual void VisitLambdaExpression (LambdaExpression lambdaExpression)
		{
			VisitChildren (lambdaExpression);
		}
示例#39
0
 /// <summary>
 /// Adds mapping attribute to a member, specified using lambda expression.
 /// </summary>
 /// <param name="func">Target member, specified using lambda expression.</param>
 /// <param name="attribute">Mapping attribute to add to specified member.</param>
 /// <returns>Returns current fluent entity mapping builder.</returns>
 public EntityMappingBuilder <T> HasAttribute(LambdaExpression func, Attribute attribute)
 {
     _builder.HasAttribute(func, attribute);
     return(this);
 }
示例#40
0
		bool LambdaNeedsParenthesis(LambdaExpression lambdaExpression)
		{
			if (lambdaExpression.Parameters.Count != 1) {
				return true;
			}
			var p = lambdaExpression.Parameters.Single();
			return !(p.Type.IsNull && p.ParameterModifier == ParameterModifier.None);
		}
 protected override ShapedQueryExpression?TranslateCount(
     ShapedQueryExpression source,
     LambdaExpression predicate)
 => null;
示例#42
0
        public static EF_DataTypes Fetch(System.Linq.Expressions.Expression <Func <EF_DataType, bool> > exp, params object[] values)
        {
            LambdaExpression lambda = LambdaExpression.Create <EF_DataType>(exp, values);

            return(EF.DataPortal.Fetch <EF_DataTypes>(lambda));
        }
示例#43
0
 internal static Expression Create(ExpressionType nodeType, Expression left, Expression right, Type type, MethodInfo method, LambdaExpression conversion) {
     if (nodeType == ExpressionType.Assign) {
         Debug.Assert(method == null && TypeUtils.AreEquivalent(type, left.Type));
         return new AssignBinaryExpression(left, right);
     }
     if (conversion != null) {
         Debug.Assert(method == null && TypeUtils.AreEquivalent(type, right.Type) && nodeType == ExpressionType.Coalesce);
         return new CoalesceConversionBinaryExpression(left, right, conversion);
     }
     if (method != null) {
         return new MethodBinaryExpression(nodeType, left, right, type, method);
     }
     if (type == typeof(bool)) {
         return new LogicalBinaryExpression(nodeType, left, right);
     }
     return new SimpleBinaryExpression(nodeType, left, right, type);
 }
        public static WhereExpression ResolveWhere(LambdaExpression whereExpression, string prefix = null)
        {
            var where = new WhereExpression(whereExpression, prefix, ProviderOption);

            return(where);
        }
示例#45
0
 internal OpAssignMethodConversionBinaryExpression(ExpressionType nodeType, Expression left, Expression right, Type type, MethodInfo method, LambdaExpression conversion)
     : base(nodeType, left, right, type, method) {
     _conversion = conversion;
 }
示例#46
0
 internal override Expression VisitLambda(LambdaExpression lambda)
 {
     throw new NotSupportedException(SR.ALinqLambdaNotSupported);
 }
示例#47
0
 public static BinaryExpression MakeBinary(ExpressionType binaryType, Expression left, Expression right, bool liftToNull, MethodInfo method, LambdaExpression conversion) {
     switch (binaryType) {
         case ExpressionType.Add:
             return Add(left, right, method);
         case ExpressionType.AddChecked:
             return AddChecked(left, right, method);
         case ExpressionType.Subtract:
             return Subtract(left, right, method);
         case ExpressionType.SubtractChecked:
             return SubtractChecked(left, right, method);
         case ExpressionType.Multiply:
             return Multiply(left, right, method);
         case ExpressionType.MultiplyChecked:
             return MultiplyChecked(left, right, method);
         case ExpressionType.Divide:
             return Divide(left, right, method);
         case ExpressionType.Modulo:
             return Modulo(left, right, method);
         case ExpressionType.Power:
             return Power(left, right, method);
         case ExpressionType.And:
             return And(left, right, method);
         case ExpressionType.AndAlso:
             return AndAlso(left, right, method);
         case ExpressionType.Or:
             return Or(left, right, method);
         case ExpressionType.OrElse:
             return OrElse(left, right, method);
         case ExpressionType.LessThan:
             return LessThan(left, right, liftToNull, method);
         case ExpressionType.LessThanOrEqual:
             return LessThanOrEqual(left, right, liftToNull, method);
         case ExpressionType.GreaterThan:
             return GreaterThan(left, right, liftToNull, method);
         case ExpressionType.GreaterThanOrEqual:
             return GreaterThanOrEqual(left, right, liftToNull, method);
         case ExpressionType.Equal:
             return Equal(left, right, liftToNull, method);
         case ExpressionType.NotEqual:
             return NotEqual(left, right, liftToNull, method);
         case ExpressionType.ExclusiveOr:
             return ExclusiveOr(left, right, method);
         case ExpressionType.Coalesce:
             return Coalesce(left, right, conversion);
         case ExpressionType.ArrayIndex:
             return ArrayIndex(left, right);
         case ExpressionType.RightShift:
             return RightShift(left, right, method);
         case ExpressionType.LeftShift:
             return LeftShift(left, right, method);
         case ExpressionType.Assign:
             return Assign(left, right);
         case ExpressionType.AddAssign:
             return AddAssign(left, right, method, conversion);
         case ExpressionType.AndAssign:
             return AndAssign(left, right, method, conversion);
         case ExpressionType.DivideAssign:
             return DivideAssign(left, right, method, conversion);
         case ExpressionType.ExclusiveOrAssign:
             return ExclusiveOrAssign(left, right, method, conversion);
         case ExpressionType.LeftShiftAssign:
             return LeftShiftAssign(left, right, method, conversion);
         case ExpressionType.ModuloAssign:
             return ModuloAssign(left, right, method, conversion);
         case ExpressionType.MultiplyAssign:
             return MultiplyAssign(left, right, method, conversion);
         case ExpressionType.OrAssign:
             return OrAssign(left, right, method, conversion);
         case ExpressionType.PowerAssign:
             return PowerAssign(left, right, method, conversion);
         case ExpressionType.RightShiftAssign:
             return RightShiftAssign(left, right, method, conversion);
         case ExpressionType.SubtractAssign:
             return SubtractAssign(left, right, method, conversion);
         case ExpressionType.AddAssignChecked:
             return AddAssignChecked(left, right, method, conversion);
         case ExpressionType.SubtractAssignChecked:
             return SubtractAssignChecked(left, right, method, conversion);
         case ExpressionType.MultiplyAssignChecked:
             return MultiplyAssignChecked(left, right, method, conversion);
         default:
             throw Error.UnhandledBinary(binaryType);
     }
 }
示例#48
0
 public static FI_PerFreeTaxItems Fetch(int page, int rowCount, System.Linq.Expressions.Expression <Func <FI_PerFreeTaxItem, bool> > exp, params object[] values)
 {
     return(EF.DataPortal.Fetch <FI_PerFreeTaxItems>(new PagigExpress {
         Page = page, RowCount = rowCount, Lambda = LambdaExpression.Create <FI_PerFreeTaxItem>(exp, values)
     }));
 }
 public override void PostWalk(LambdaExpression node) { }
示例#50
0
        public static FI_PerFreeTaxItems Fetch(System.Linq.Expressions.Expression <Func <FI_PerFreeTaxItem, bool> > exp, params object[] values)
        {
            LambdaExpression lambda = LambdaExpression.Create <FI_PerFreeTaxItem>(exp, values);

            return(EF.DataPortal.Fetch <FI_PerFreeTaxItems>(lambda));
        }
 public virtual void PostWalk(LambdaExpression node) { }
        private static LambdaExpression BindOrderByClause(FilterBinder binder, OrderByClause orderBy, Type elementType)
        {
            LambdaExpression orderByLambda = binder.BindExpression(orderBy.Expression, orderBy.RangeVariable, elementType);

            return(orderByLambda);
        }
示例#53
0
		public void VisitLambdaExpression(LambdaExpression lambdaExpression)
		{
			StartNode(lambdaExpression);
			if (lambdaExpression.IsAsync) {
				WriteKeyword(LambdaExpression.AsyncModifierRole);
				Space();
			}
			if (LambdaNeedsParenthesis(lambdaExpression)) {
				WriteCommaSeparatedListInParenthesis(lambdaExpression.Parameters, policy.SpaceWithinMethodDeclarationParentheses);
			} else {
				lambdaExpression.Parameters.Single().AcceptVisitor(this);
			}
			Space();
			WriteToken(LambdaExpression.ArrowRole);
			Space();
			lambdaExpression.Body.AcceptVisitor(this);
			EndNode(lambdaExpression);
		}
示例#54
0
 protected override Expression VisitLambdaExpression(LambdaExpression expression)
 {
     return(expression);
 }
示例#55
0
		static LambdaExpression BuildLambda(string variableName, Expression expression)
		{
			var lambda = new LambdaExpression();
			lambda.Parameters.Add(new ParameterDeclaration() {
				Name = variableName
			});
			lambda.Body = expression.Clone();
			return lambda;
		}
示例#56
0
 public override void VisitLambdaExpression(LambdaExpression lambdaExpression)
 {
     VisitNewDeclarationSpace(lambdaExpression);
 }
示例#57
0
文件: linq.cs 项目: alisci01/mono
		protected override void CreateArguments (ResolveContext ec, Parameter parameter, ref Arguments args)
		{
			base.CreateArguments (ec, parameter, ref args);

			if (element_selector != null) {
				LambdaExpression lambda = new LambdaExpression (element_selector.Location);

				element_block.SetParameter (parameter.Clone ());
				lambda.Block = element_block;
				lambda.Block.AddStatement (new ContextualReturn (element_selector));
				args.Add (new Argument (lambda));
			}
		}
示例#58
0
 public bool IsAssumptionWrong(LambdaExpression assumption)
 {
     return(_failedAssumptions.Contains(assumption));
 }
示例#59
0
文件: linq.cs 项目: alisci01/mono
		protected override void CreateArguments (ResolveContext ec, Parameter parameter, ref Arguments args)
		{
			if (args == null) {
				if (IdentifierType != null)
					expr = CreateCastExpression (expr);

				base.CreateArguments (ec, parameter, ref args);
			}

			Expression result_selector_expr;
			QueryBlock result_block;

			var target = GetIntoVariable ();
			var target_param = new ImplicitLambdaParameter (target.Name, target.Location);

			//
			// When select follows use it as a result selector
			//
			if (next is Select) {
				result_selector_expr = next.Expr;

				result_block = next.block;
				result_block.SetParameters (parameter, target_param);

				next = next.next;
			} else {
				result_selector_expr = CreateRangeVariableType (ec, parameter, target, new SimpleName (target.Name, target.Location));

				result_block = new QueryBlock (ec.Compiler, block.Parent, block.StartLocation);
				result_block.SetParameters (parameter, target_param);
			}

			LambdaExpression result_selector = new LambdaExpression (Location);
			result_selector.Block = result_block;
			result_selector.Block.AddStatement (new ContextualReturn (result_selector_expr));

			args.Add (new Argument (result_selector));
		}
示例#60
0
 public static HR_EmpPositionBills Fetch(int page, int rowCount, System.Linq.Expressions.Expression <Func <HR_EmpPositionBill, bool> > exp, params object[] values)
 {
     return(EF.DataPortal.Fetch <HR_EmpPositionBills>(new PagigExpress {
         Page = page, RowCount = rowCount, Lambda = LambdaExpression.Create <HR_EmpPositionBill>(exp, values)
     }));
 }