Mercurial > pub > bltoolkit
comparison Source/Data/Linq/Builder/CastBuilder.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.Data; | |
3 using System.Linq.Expressions; | |
4 | |
5 namespace BLToolkit.Data.Linq.Builder | |
6 { | |
7 using BLToolkit.Linq; | |
8 | |
9 class CastBuilder : MethodCallBuilder | |
10 { | |
11 protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) | |
12 { | |
13 return methodCall.IsQueryable("Cast"); | |
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 return new CastContext(sequence, methodCall); | |
21 } | |
22 | |
23 protected override SequenceConvertInfo Convert( | |
24 ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param) | |
25 { | |
26 return null; | |
27 } | |
28 | |
29 class CastContext : PassThroughContext | |
30 { | |
31 public CastContext(IBuildContext context, MethodCallExpression methodCall) | |
32 : base(context) | |
33 { | |
34 _methodCall = methodCall; | |
35 } | |
36 | |
37 private readonly MethodCallExpression _methodCall; | |
38 | |
39 public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter) | |
40 { | |
41 var expr = BuildExpression(null, 0); | |
42 var mapper = Builder.BuildMapper<T>(expr); | |
43 | |
44 query.SetQuery(mapper.Compile()); | |
45 } | |
46 | |
47 public override Expression BuildExpression(Expression expression, int level) | |
48 { | |
49 var expr = base.BuildExpression(expression, level); | |
50 var type = _methodCall.Method.GetGenericArguments()[0]; | |
51 | |
52 if (expr.Type != type) | |
53 expr = Expression.Convert(expr, type); | |
54 | |
55 return expr; | |
56 } | |
57 } | |
58 } | |
59 } |