protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) { var isHaving = methodCall.Method.Name == "Having"; var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0])); var condition = (LambdaExpression)methodCall.Arguments[1].Unwrap(); var result = builder.BuildWhere(buildInfo.Parent, sequence, condition, !isHaving, isHaving); result.SetAlias(condition.Parameters[0].Name); return(result); }
protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) { var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0])); if (methodCall.Arguments.Count == 2) { sequence = builder.BuildWhere(buildInfo.Parent, sequence, (LambdaExpression)methodCall.Arguments[1].Unwrap(), false); } sequence.Select.EQueryType = EQueryType.Delete; // Check association. // var ctx = sequence as SelectContext; if (ctx != null && ctx.IsScalar) { var res = ctx.IsExpression(null, 0, RequestFor.Association); var associatedTableContext = res.Context as TableBuilder.AssociatedTableContext; if (res.Result && associatedTableContext != null) { sequence.Select.Delete.Table = associatedTableContext.SqlTable; } else { res = ctx.IsExpression(null, 0, RequestFor.Table); var tableContext = res.Context as TableBuilder.TableContext; if (res.Result && tableContext != null) { if (sequence.Select.From.Tables.Count == 0 || sequence.Select.From.Tables.First.Value.Source != tableContext.Select) { sequence.Select.Delete.Table = tableContext.SqlTable; } } } } return(new DeleteContext(buildInfo.Parent, sequence)); }
protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) { var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]) { CopyTable = true }); if (methodCall.Arguments.Count == 2) { var condition = (LambdaExpression)methodCall.Arguments[1].Unwrap(); if (methodCall.Method.Name == "All") { condition = Expression.Lambda(Expression.Not(condition.Body), condition.Name, condition.Parameters); } sequence = builder.BuildWhere(buildInfo.Parent, sequence, condition, true); sequence.SetAlias(condition.Parameters[0].Name); } return(new AllAnyContext(buildInfo.Parent, methodCall, sequence)); }