Mercurial > pub > bltoolkit
view Source/Data/Linq/Builder/DeleteBuilder.cs @ 9:1e85f66cf767 default tip
update bltoolkit
author | nickolay |
---|---|
date | Thu, 05 Apr 2018 20:53:26 +0300 |
parents | f990fcb411a9 |
children |
line wrap: on
line source
using System; using System.Linq.Expressions; namespace BLToolkit.Data.Linq.Builder { using BLToolkit.Linq; using Data.Sql; class DeleteBuilder : MethodCallBuilder { protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) { return methodCall.IsQueryable("Delete"); } 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.SqlQuery.QueryType = QueryType.Delete; // Check association. // var ctx = sequence as SelectContext; if (ctx != null && ctx.IsScalar) { var res = ctx.IsExpression(null, 0, RequestFor.Association); if (res.Result && res.Context is TableBuilder.AssociatedTableContext) { var atc = (TableBuilder.AssociatedTableContext)res.Context; sequence.SqlQuery.Delete.Table = atc.SqlTable; } else { res = ctx.IsExpression(null, 0, RequestFor.Table); if (res.Result && res.Context is TableBuilder.TableContext) { var tc = (TableBuilder.TableContext)res.Context; if (sequence.SqlQuery.From.Tables.Count == 0 || sequence.SqlQuery.From.Tables[0].Source != tc.SqlQuery) sequence.SqlQuery.Delete.Table = tc.SqlTable; } } } return new DeleteContext(buildInfo.Parent, sequence); } protected override SequenceConvertInfo Convert( ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param) { return null; } class DeleteContext : SequenceContextBase { public DeleteContext(IBuildContext parent, IBuildContext sequence) : base(parent, sequence, null) { } public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter) { query.SetNonQueryQuery(); } public override Expression BuildExpression(Expression expression, int level) { throw new InvalidOperationException(); } public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags) { throw new InvalidOperationException(); } public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags) { throw new InvalidOperationException(); } public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag) { throw new InvalidOperationException(); } public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo) { throw new InvalidOperationException(); } } } }