diff Source/Data/Linq/Builder/CastBuilder.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/CastBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,59 @@
+using System;
+using System.Data;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+
+	class CastBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("Cast");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+
+			return new CastContext(sequence, methodCall);
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		class CastContext : PassThroughContext
+		{
+			public CastContext(IBuildContext context, MethodCallExpression methodCall)
+				: base(context)
+			{
+				_methodCall = methodCall;
+			}
+
+			private readonly MethodCallExpression _methodCall;
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				var expr   = BuildExpression(null, 0);
+				var mapper = Builder.BuildMapper<T>(expr);
+
+				query.SetQuery(mapper.Compile());
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				var expr = base.BuildExpression(expression, level);
+				var type = _methodCall.Method.GetGenericArguments()[0];
+
+				if (expr.Type != type)
+					expr = Expression.Convert(expr, type);
+
+				return expr;
+			}
+		}
+	}
+}