diff Source/Data/Linq/Builder/WhereBuilder.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/WhereBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,57 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+
+	class WhereBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("Where");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			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, true);
+
+			result.SetAlias(condition.Parameters[0].Name);
+
+			return result;
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			var predicate = (LambdaExpression)methodCall.Arguments[1].Unwrap();
+			var info      = builder.ConvertSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]), predicate.Parameters[0]);
+
+			if (info != null)
+			{
+				info.Expression = methodCall.Convert(ex => ConvertMethod(methodCall, 0, info, predicate.Parameters[0], ex));
+
+				if (param != null)
+				{
+					if (param.Type != info.Parameter.Type)
+						param = Expression.Parameter(info.Parameter.Type, param.Name);
+
+					if (info.ExpressionsToReplace != null)
+						foreach (var path in info.ExpressionsToReplace)
+						{
+							path.Path = path.Path.Convert(e => e == info.Parameter ? param : e);
+							path.Expr = path.Expr.Convert(e => e == info.Parameter ? param : e);
+						}
+				}
+
+				info.Parameter = param;
+
+				return info;
+			}
+
+			return null;
+		}
+	}
+}