Mercurial > pub > bltoolkit
comparison Source/Data/Linq/Builder/DeleteBuilder.cs @ 0:f990fcb411a9
Копия текущей версии из github
| author | cin |
|---|---|
| date | Thu, 27 Mar 2014 21:46:09 +0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:f990fcb411a9 |
|---|---|
| 1 using System; | |
| 2 using System.Linq.Expressions; | |
| 3 | |
| 4 namespace BLToolkit.Data.Linq.Builder | |
| 5 { | |
| 6 using BLToolkit.Linq; | |
| 7 using Data.Sql; | |
| 8 | |
| 9 class DeleteBuilder : MethodCallBuilder | |
| 10 { | |
| 11 protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) | |
| 12 { | |
| 13 return methodCall.IsQueryable("Delete"); | |
| 14 } | |
| 15 | |
| 16 protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) | |
| 17 { | |
| 18 var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0])); | |
| 19 | |
| 20 if (methodCall.Arguments.Count == 2) | |
| 21 sequence = builder.BuildWhere(buildInfo.Parent, sequence, (LambdaExpression)methodCall.Arguments[1].Unwrap(), false); | |
| 22 | |
| 23 sequence.SqlQuery.QueryType = QueryType.Delete; | |
| 24 | |
| 25 // Check association. | |
| 26 // | |
| 27 var ctx = sequence as SelectContext; | |
| 28 | |
| 29 if (ctx != null && ctx.IsScalar) | |
| 30 { | |
| 31 var res = ctx.IsExpression(null, 0, RequestFor.Association); | |
| 32 | |
| 33 if (res.Result && res.Context is TableBuilder.AssociatedTableContext) | |
| 34 { | |
| 35 var atc = (TableBuilder.AssociatedTableContext)res.Context; | |
| 36 sequence.SqlQuery.Delete.Table = atc.SqlTable; | |
| 37 } | |
| 38 else | |
| 39 { | |
| 40 res = ctx.IsExpression(null, 0, RequestFor.Table); | |
| 41 | |
| 42 if (res.Result && res.Context is TableBuilder.TableContext) | |
| 43 { | |
| 44 var tc = (TableBuilder.TableContext)res.Context; | |
| 45 | |
| 46 if (sequence.SqlQuery.From.Tables.Count == 0 || sequence.SqlQuery.From.Tables[0].Source != tc.SqlQuery) | |
| 47 sequence.SqlQuery.Delete.Table = tc.SqlTable; | |
| 48 } | |
| 49 } | |
| 50 } | |
| 51 | |
| 52 return new DeleteContext(buildInfo.Parent, sequence); | |
| 53 } | |
| 54 | |
| 55 protected override SequenceConvertInfo Convert( | |
| 56 ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param) | |
| 57 { | |
| 58 return null; | |
| 59 } | |
| 60 | |
| 61 class DeleteContext : SequenceContextBase | |
| 62 { | |
| 63 public DeleteContext(IBuildContext parent, IBuildContext sequence) | |
| 64 : base(parent, sequence, null) | |
| 65 { | |
| 66 } | |
| 67 | |
| 68 public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter) | |
| 69 { | |
| 70 query.SetNonQueryQuery(); | |
| 71 } | |
| 72 | |
| 73 public override Expression BuildExpression(Expression expression, int level) | |
| 74 { | |
| 75 throw new InvalidOperationException(); | |
| 76 } | |
| 77 | |
| 78 public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags) | |
| 79 { | |
| 80 throw new InvalidOperationException(); | |
| 81 } | |
| 82 | |
| 83 public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags) | |
| 84 { | |
| 85 throw new InvalidOperationException(); | |
| 86 } | |
| 87 | |
| 88 public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag) | |
| 89 { | |
| 90 throw new InvalidOperationException(); | |
| 91 } | |
| 92 | |
| 93 public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo) | |
| 94 { | |
| 95 throw new InvalidOperationException(); | |
| 96 } | |
| 97 } | |
| 98 } | |
| 99 } |
