示例#1
0
文件: TestBuilder.cs 项目: vigoo/bari
        public ISet<TargetRelativePath> Run(IBuildContext context)
        {
            var targetDir = targetRoot.CreateDirectory(project.RelativeTargetPath);
            if (targetDir == null)
                targetDir = targetRoot.CreateDirectory(project.RelativeTargetPath);

            var sourceSet = project.GetSourceSet("scr");
            var result = new HashSet<TargetRelativePath>();
            foreach (var file in sourceSet.Files)
            {
                log.DebugFormat("Processing {0}", file);

                using (var reader = suiteRoot.ReadTextFile(file))
                {
                    var contents = reader.ReadToEnd();
                    var msg = String.Format("Hello {0}!!!", contents);
                    var fileName = Path.GetFileName(file);

                    using (var writer = targetDir.CreateTextFile(fileName + ".txt"))
                        writer.WriteLine(msg);

                    result.Add(new TargetRelativePath(project.RelativeTargetPath, fileName + ".txt"));
                }
            }

            return result;
        }
        public override void Generate(IBuildContext context, IProject project)
        {
            var host = GetHost(context, project);

            foreach (var fileName in context.FileSystem.GetFiles(context.ProjectDirectory, "*.project.tt", SearchOption.AllDirectories))
            {
                if (Ignore(fileName))
                {
                    continue;
                }

                context.Trace.TraceInformation(Msg.G1008, Texts.Generating_code, PathHelper.UnmapPath(context.ProjectDirectory, fileName));

                try
                {
                    if (!host.ProcessTemplate(fileName, fileName.Left(fileName.Length - 11)))
                    {
                        TraceErrors(context, host, fileName);
                    }
                }
                catch (Exception ex)
                {
                    context.Trace.TraceError(Msg.G1007, ex.Message, fileName, TextSpan.Empty);
                }
            }
        }
示例#3
0
 public EnumerableImpl(object key, Type type, Type resultType, IBuildContext firstBuildCtx, ICRegILGen firstReg)
 {
     _key = key;
     _type = type;
     _resultType = resultType;
     _list.Add(new KeyValuePair<IBuildContext, ICRegILGen>(firstBuildCtx, firstReg));
 }
        public override void Run(IBuildContext context)
        {
            context.Trace.TraceInformation(Msg.S1000, Texts.SynchronizingWebsite);

            var url = MakeWebApiUrl(context, "SynchronizeWebsite");
            var targetFileName = Path.GetTempFileName();

            if (!DownloadFile(context, url, targetFileName))
            {
                return;
            }

            context.Trace.TraceInformation(Msg.S1001, Texts.Updating_resources___);

            using (var zip = ZipFile.OpenRead(targetFileName))
            {
                foreach (var entry in zip.Entries)
                {
                    context.Trace.TraceInformation(Msg.S1002, entry.FullName);
                    entry.ExtractToFile(Path.Combine(context.ProjectDirectory, entry.FullName), true);
                }
            }

            context.FileSystem.DeleteFile(targetFileName);
        }
        public override void Run(IBuildContext context)
        {
            if (context.Project.HasErrors)
            {
                context.Trace.TraceInformation(Msg.D1017, Texts.Package_contains_errors_and_will_not_be_deployed);
                context.IsAborted = true;
                return;
            }

            context.Trace.TraceInformation(Msg.D1023, Texts.Creating_npm_module___);

            var npmFileName = Path.Combine(context.ProjectDirectory, "package.json");
            if (!context.FileSystem.FileExists(npmFileName))
            {
                context.Trace.TraceInformation(Msg.D1024, Texts._package_json__file_not_found__Skipping_);
                return;
            }

            var process = new Process();
            process.StartInfo.FileName = "npm";
            process.StartInfo.Arguments = "pack";
            process.StartInfo.WorkingDirectory = context.ProjectDirectory;
            process.StartInfo.UseShellExecute = true;
            process.StartInfo.CreateNoWindow = true;
            process.Start();
            process.WaitForExit();

            var outputFileName = GetOutputFileName(context, npmFileName);
            if (!string.IsNullOrEmpty(outputFileName) && context.FileSystem.FileExists(outputFileName))
            {
                context.OutputFiles.Add(outputFileName);
            }
        }
示例#6
0
        static void BuildSkip(ExpressionBuilder builder, IBuildContext sequence, ISqlExpression prevSkipValue, ISqlExpression expr)
        {
            var sql = sequence.SqlQuery;

            builder.SqlProvider.SqlQuery = sql;

            sql.Select.Skip(expr);

            builder.SqlProvider.SqlQuery = sql;

            if (sql.Select.TakeValue != null)
            {
                if (builder.DataContextInfo.SqlProviderFlags.GetIsSkipSupportedFlag(sql) ||
                    !builder.DataContextInfo.SqlProviderFlags.IsTakeSupported)
                    sql.Select.Take(builder.Convert(
                        sequence,
                        new SqlBinaryExpression(typeof(int), sql.Select.TakeValue, "-", sql.Select.SkipValue, Precedence.Additive)));

                if (prevSkipValue != null)
                    sql.Select.Skip(builder.Convert(
                        sequence,
                        new SqlBinaryExpression(typeof(int), prevSkipValue, "+", sql.Select.SkipValue, Precedence.Additive)));
            }

            if (!builder.DataContextInfo.SqlProviderFlags.GetAcceptsTakeAsParameterFlag(sql))
            {
                var p = sql.Select.SkipValue as SqlParameter;

                if (p != null)
                    p.IsQueryParameter = false;
            }
        }
        public override void Run(IBuildContext context)
        {
            context.Trace.TraceInformation(Msg.D1000, Texts.Copying_dependencies___);

            var sourceDirectory = context.Configuration.Get(Constants.Configuration.CopyDependenciesSourceDirectory);
            sourceDirectory = Path.Combine(context.ProjectDirectory, sourceDirectory);
            if (!context.FileSystem.DirectoryExists(sourceDirectory))
            {
                context.Trace.TraceInformation(Msg.D1003, Texts.Dependencies_directory_not_found__Skipping, sourceDirectory);
                return;
            }

            foreach (var pair in context.Configuration.GetSubKeys("copy-package"))
            {
                var key = "copy-package:" + pair.Key;

                var destinationDirectory = context.Configuration.GetString(key + ":copy-to-directory");
                if (string.IsNullOrEmpty(destinationDirectory))
                {
                    context.Trace.TraceError(Msg.D1001, Texts.Destination_directory_not_found, key + ":copy-to-directory");
                    continue;
                }

                destinationDirectory = PathHelper.NormalizeFilePath(destinationDirectory).TrimStart('\\');
                destinationDirectory = PathHelper.Combine(context.Configuration.Get(Constants.Configuration.DataFolderDirectory), destinationDirectory);

                context.FileSystem.CreateDirectory(destinationDirectory);

                CopyNuGetPackages(context, sourceDirectory, destinationDirectory);
            }
        }
        public override void Run(IBuildContext context)
        {
            Context = context;
            Context.IsAborted = true;

            var include = context.Configuration.GetString(Constants.Configuration.WatchProjectInclude, "**");
            var exclude = context.Configuration.GetString(Constants.Configuration.WatchProjectExclude, "**");
            _pathMatcher = new PathMatcher(include, exclude);

            _publishDatabase = context.Configuration.GetBool(Constants.Configuration.WatchProjectPublishDatabase, true);

            _fileWatcher = new FileSystemWatcher(context.ProjectDirectory)
            {
                IncludeSubdirectories = true,
                NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName
            };

            _fileWatcher.Changed += FileChanged;
            _fileWatcher.Deleted += FileChanged;
            _fileWatcher.Renamed += FileChanged;
            _fileWatcher.Created += FileChanged;
            _fileWatcher.Created += FileChanged;

            _fileWatcher.EnableRaisingEvents = true;

            Console.WriteLine(Texts.Type__q__to_quit___);

            string input;
            do
            {
                input = Console.ReadLine();
            }
            while (!string.Equals(input, "q", StringComparison.OrdinalIgnoreCase));
        }
示例#9
0
文件: MBFile.cs 项目: emtees/old-code
		public string GetPath (IBuildContext ctxt) {
			if (dir == null)
				return null;

			string p = ctxt.PathTo (dir);
			return Path.Combine (p, name);
		}
示例#10
0
        /// <summary>
        /// Runs this builder
        /// </summary>
        /// <param name="context"> </param>
        /// <returns>Returns a set of generated files, in suite relative paths</returns>
        public ISet<TargetRelativePath> Run(IBuildContext context)
        {
            var currentFingerprint = wrappedBuilder.Dependencies.CreateFingerprint();
            var buildKey = new BuildKey(wrappedBuilder.GetType(), wrappedBuilder.Uid);

            cache.LockForBuilder(buildKey);
            try
            {
                if (cache.Contains(buildKey, currentFingerprint))
                {
                    log.DebugFormat("Restoring cached build outputs for {0}", buildKey);
                    return cache.Restore(buildKey, targetDir);
                }
                else
                {
                    log.DebugFormat("Running builder {0}", buildKey);
                    var files = wrappedBuilder.Run(context);

                    log.DebugFormat("Storing build outputs of {0}", buildKey);
                    cache.Store(buildKey, currentFingerprint, files, targetDir);
                    return files;
                }
            }
            finally
            {
                cache.UnlockForBuilder(buildKey);
            }
        }
        public override void Run(IBuildContext context)
        {
            if (context.Project.HasErrors)
            {

                context.Trace.TraceInformation(Msg.D1012, Texts.Package_contains_errors_and_will_not_be_deployed);
                context.IsAborted = true;
                return;
            }

            context.Trace.TraceInformation(Msg.D1016, Texts.Publishing___);

            if (string.Equals(context.Project.Options.DatabaseName, "core", StringComparison.OrdinalIgnoreCase))
            {
                context.Trace.TraceInformation(Msg.D1013, Texts.Database_is__core___Skipping_);
                return;
            }

            context.Trace.TraceInformation(Msg.D1014, Texts.Database, context.Project.Options.DatabaseName);

            var queryStringParameters = new Dictionary<string, string>
            {
                ["m"] = "i",
                ["db"] = context.Project.Options.DatabaseName
            };

            var url = MakeUrl(context, context.Configuration.GetString(Constants.Configuration.PublishUrl), queryStringParameters);
            Request(context, url);
        }
        /// <summary>
        ///     The on perpare.
        /// </summary>
        /// <param name="context">
        ///     The context.
        /// </param>
        public override void OnPerpare(IBuildContext context)
        {
            if (context.Target != null) return;

            context.ErrorTracer.Phase = "Reciving Construtor Informations for " + context.Metadata;

            IImportInterceptor interceptor;

            context.Policys.Add(
                new ConstructorPolicy
                {
                    Constructor =
                        context.UseInternalInstantiation()
                            ? Helper.WriteDefaultCreation(context)
                            : context.Metadata.Export.ExternalInfo.Create,
                    Generator =
                        _service.Generate(context.Metadata, context.Metadata.Export.ImportMetadata.ToArray(),
                                          out interceptor)
                });

            if (interceptor == null) return;

            var pol = context.Policys.Get<ExternalImportInterceptorPolicy>();

            if (pol != null) pol.Interceptors.Add(interceptor);
            else
            {
                pol = new ExternalImportInterceptorPolicy();
                pol.Interceptors.Add(interceptor);

                context.Policys.Add(pol);
            }
        }
示例#13
0
        public override void Run(IBuildContext context)
        {
            if (context.Project.HasErrors)
            {
                return;
            }

            context.Trace.TraceInformation(Msg.D1015, Texts.Writing_package_exports___);

            var fileName = PathHelper.Combine(context.ProjectDirectory, context.Configuration.GetString(Constants.Configuration.WriteExportsFileName));

            var fieldToWrite = context.Configuration.GetString(Constants.Configuration.WriteExportsFieldsToWrite).Split(Constants.Comma, StringSplitOptions.RemoveEmptyEntries).Select(f => f.Trim()).ToList();

            using (var writer = new StreamWriter(fileName))
            {
                using (var output = new XmlTextWriter(writer))
                {
                    output.Formatting = Formatting.Indented;

                    output.WriteStartElement("Exports");

                    foreach (var template in context.Project.ProjectItems.OfType<Template>().Where(template => !template.IsImport))
                    {
                        template.WriteAsExportXml(output);
                    }

                    foreach (var item in context.Project.ProjectItems.OfType<Item>().Where(item => !item.IsImport))
                    {
                        item.WriteAsExportXml(output, fieldToWrite);
                    }

                    output.WriteEndElement();
                }
            }
        }
示例#14
0
        public override void Run(IBuildContext context)
        {
            if (context.Project.HasErrors)
            {
                context.Trace.TraceInformation(Msg.D1004, Texts.Package_contains_errors_and_will_not_be_deployed);
                context.IsAborted = true;
                return;
            }

            context.Trace.TraceInformation(Msg.D1005, Texts.Copying_package_to_website___);

            foreach (var pair in context.Configuration.GetSubKeys("copy-package"))
            {
                var key = "copy-package:" + pair.Key;

                var destinationDirectory = context.Configuration.GetString(key + ":copy-to-directory");
                if (string.IsNullOrEmpty(destinationDirectory))
                {
                    context.Trace.TraceError(Msg.D1006, Texts.Destination_directory_not_found, key + ":copy-to-directory");
                    continue;
                }

                destinationDirectory = PathHelper.NormalizeFilePath(destinationDirectory).TrimStart('\\');
                destinationDirectory = PathHelper.Combine(context.Configuration.Get(Constants.Configuration.DataFolderDirectory), destinationDirectory);

                context.FileSystem.CreateDirectory(destinationDirectory);

                foreach (var fileName in context.OutputFiles)
                {
                    var destinationFileName = PathHelper.Combine(destinationDirectory, Path.GetFileName(fileName));
                    context.FileSystem.Copy(fileName, destinationFileName);
                }
            }
        }
        public override void Run(IBuildContext context)
        {
            context.IsAborted = true;
            context.Trace.TraceInformation(Msg.M1012, Texts.Writing_website_exports___);

            var url = MakeWebApiUrl(context, "WriteWebsiteExports");
            var targetFileName = Path.GetTempFileName();

            if (!DownloadFile(context, url, targetFileName))
            {
                return;
            }

            using (var zip = ZipFile.OpenRead(targetFileName))
            {
                foreach (var entry in zip.Entries)
                {
                    context.Trace.TraceInformation(Msg.M1013, entry.FullName);

                    var fileName = Path.Combine(context.ProjectDirectory, entry.FullName);
                    context.FileSystem.CreateDirectory(Path.GetDirectoryName(fileName) ?? string.Empty);

                    entry.ExtractToFile(fileName, true);
                }
            }

            context.FileSystem.DeleteFile(targetFileName);
        }
示例#16
0
        /// <summary>
        /// Adds the builders (<see cref="IBuilder"/>) to the given build context which process
        /// the given set of projects (<see cref="Project"/>)
        /// </summary>
        /// <param name="context">Current build context</param>
        /// <param name="projects">Projects to be built</param>
        public IBuilder AddToContext(IBuildContext context, IEnumerable<Project> projects)
        {
            Contract.Requires(context != null);
            Contract.Requires(projects != null);

            return null; // dummy value
        }
示例#17
0
	public override Result Build (IBuildContext ctxt) 
	{
	    // A more orthodox subclass might call Rule.CreateResultObject
	    // and do some value.CopyValueTo (result), but this is simpler.

	    return (Result) value.Clone ();
	}
示例#18
0
        public override void Run(IBuildContext context)
        {
            context.DisplayDoneMessage = false;

            var qualifiedName = context.Configuration.GetCommandLineArg(1).Trim();
            if (string.IsNullOrEmpty(qualifiedName))
            {
                qualifiedName = context.Configuration.GetString("name").Trim();
            }

            if (string.IsNullOrEmpty(qualifiedName))
            {
                context.Trace.WriteLine(Texts.You_must_specific_the___name_argument);
                return;
            }

            var newShortName = context.Configuration.GetCommandLineArg(2).Trim();
            if (string.IsNullOrEmpty(newShortName))
            {
                newShortName = context.Configuration.GetString("to").Trim();
            }

            if (string.IsNullOrEmpty(newShortName))
            {
                context.Trace.WriteLine(Texts.You_must_specific_the___to_argument);
                return;
            }

            var projectItem = context.Project.FindQualifiedItem(qualifiedName);
            if (projectItem == null)
            {
                context.Trace.WriteLine(Texts.Item_not_found, qualifiedName);
                return;
            }

            var value = projectItem.QualifiedName;
            var n = value.LastIndexOf('/');
            value = n < 0 ? newShortName : value.Left(n + 1) + newShortName;

            var queryService = context.CompositionService.Resolve<IQueryService>();
            var references = queryService.FindUsages(context.Project, qualifiedName).ToList();

            foreach (var reference in references)
            {
                reference.SourceProperty.SetValue(value);
            }

            var changedFileNames = context.Project.ProjectItems.SelectMany(i => i.Snapshots).Where(s => s.IsModified).Select(s => s.SourceFile.AbsoluteFileName).ToList();

            projectItem.Rename(newShortName);
            context.Project.SaveChanges();

            foreach (var fileName in changedFileNames)
            {
                context.Trace.TraceInformation(Msg.M1017, PathHelper.UnmapPath(context.ProjectDirectory, fileName));
            }

            context.Trace.TraceInformation(Msg.M1018, $"Changed files: {changedFileNames.Count}");
        }
 public override void UpdateWebsiteFiles(IBuildContext context)
 {
     CopyToolsFileToWebsiteBinDirectory(context, "Sitecore.Pathfinder.Unicorn.dll");
     CopyToolsFileToWebsiteBinDirectory(context, "Unicorn.dll");
     CopyToolsFileToWebsiteBinDirectory(context, "Rainbow.Storage.Sc.dll");
     CopyToolsFileToWebsiteBinDirectory(context, "Rainbow.Storage.Yaml.dll");
     CopyToolsFileToWebsiteBinDirectory(context, "Rainbow.dll");
 }                               
示例#20
0
 public override void Run(IBuildContext context)
 {
     context.Trace.WriteLine("Project Metrics");
     context.Trace.WriteLine("---------------");
     context.Trace.WriteLine("Items", context.Project.ProjectItems.OfType<Item>().Count().ToString());
     context.Trace.WriteLine("Templates", context.Project.ProjectItems.OfType<Template>().Count().ToString());
     context.Trace.WriteLine("Files", context.Project.ProjectItems.OfType<Projects.Files.File>().Count().ToString());
 }
        public override void Run(IBuildContext context)
        {
            context.Trace.TraceInformation(Msg.G1012, Texts.Importing_website___);

            var url = MakeWebApiUrl(context, "ImportWebsite");

            Request(context, url);
        }
 public override void RemoveWebsiteFiles(IBuildContext context)
 {
     RemoveWebsiteAssembly(context, "Sitecore.Pathfinder.Unicorn.dll");
     RemoveWebsiteAssembly(context, "Unicorn.dll");
     RemoveWebsiteAssembly(context, "Rainbow.Storage.Sc.dll");
     RemoveWebsiteAssembly(context, "Rainbow.Storage.Yaml.dll");
     RemoveWebsiteAssembly(context, "Rainbow.dll");
 }
示例#23
0
        public override void Run(IBuildContext context)
        {
            context.Trace.TraceInformation(Msg.M1009, Texts.Resetting_website___);

            var url = MakeWebApiUrl(context, "ResetWebsite");

            Request(context, url);
        }
        public override void Run(IBuildContext context)
        {
            context.Trace.TraceInformation(Msg.M1009, "Updating the project/website mappings on the website...");

            var url = MakeWebApiUrl(context, "UpdateProjectWebsiteMappings");

            Request(context, url);
        }
        public override void Run(IBuildContext context)
        {
            context.Trace.TraceInformation(Msg.G1010, Texts.Troubleshooting___);

            var url = MakeWebApiUrl(context, "TroubleshootWebsite");

            Request(context, url);
        }
        /// <summary>
        ///     The on post build.
        /// </summary>
        /// <param name="context">
        ///     The context.
        /// </param>
        public override void OnPostBuild(IBuildContext context)
        {
            var notify = context.Target as INotifyBuildCompled;

            if (notify == null) return;

            context.ErrorTracer.Phase = "Notify Build Compled for " + context.Metadata;
            notify.BuildCompled();
        }
        public override bool UpdateWebsiteFiles(IBuildContext context)
        {
            var updated = false;

            updated |= CopyToolsFileToWebsiteBinDirectory(context, "Sitecore.Pathfinder.NuGet.dll");
            updated |= CopyToolsFileToWebsiteBinDirectory(context, "NuGet.Core.dll");

            return updated;
        }
示例#28
0
		public static ExternalBinaryInfo ParseFromUnixStyle (string command, IBuildContext ctxt) 
		{
		    ExternalBinaryInfo info = new ExternalBinaryInfo ();

		    if (info.SetFromUnixStyle (command, ctxt))
			return null;

		    return info;
		}
        /// <summary>
        ///     The on create instance.
        /// </summary>
        /// <param name="context">
        ///     The context.
        /// </param>
        public override void OnCreateInstance(IBuildContext context)
        {
            var policy = context.Policys.Get<ConstructorPolicy>();
            if (policy == null) return;

            context.ErrorTracer.Phase = "Contruct Object for " + context.Metadata;

            context.Target = policy.Constructor.Invoke(context, policy.Generator);  //(context, policy.Generator);
        }
示例#30
0
		protected bool MoveToFinal (MBFile output, MBFile tempdest, IBuildContext ctxt) {
			// We should probably move away the file before clobbering it ...
			
			if (output.Exists (ctxt))
                                output.Delete (ctxt);
 
                        tempdest.MoveTo (output, ctxt);
			return false;
		}
示例#31
0
 public DropContext(IBuildContext?parent, IBuildContext sequence)
     : base(parent, sequence, null)
 {
 }
示例#32
0
        static Expression GetMultipleQueryExpressionLazy(IBuildContext context, MappingSchema mappingSchema, Expression expression, HashSet <ParameterExpression> parameters)
        {
            expression.Visit(e =>
            {
                if (e.NodeType == ExpressionType.Lambda)
                {
                    foreach (var p in ((LambdaExpression)e).Parameters)
                    {
                        parameters.Add(p);
                    }
                }
            });

            // Convert associations.
            //
            return(expression.Transform(e =>
            {
                switch (e.NodeType)
                {
                case ExpressionType.MemberAccess :
                    {
                        var root = context.Builder.GetRootObject(e);

                        if (root != null &&
                            root.NodeType == ExpressionType.Parameter &&
                            !parameters.Contains((ParameterExpression)root))
                        {
                            var res = context.IsExpression(e, 0, RequestFor.Association);

                            if (res.Result)
                            {
                                var associationContext = (AssociationContext)res.Context !;

                                if (associationContext.Descriptor.IsList)
                                {
                                    var me = (MemberExpression)e;

                                    var parentType = me.Expression.Type;
                                    var childType = me.Type;

                                    var queryMethod = AssociationHelper.CreateAssociationQueryLambda(context.Builder,
                                                                                                     new AccessorMember(me), associationContext.Descriptor, parentType, parentType, childType, false,
                                                                                                     false, null, out _);

                                    var dcConst = Expression.Constant(context.Builder.DataContext.Clone(true));

                                    var expr = queryMethod.GetBody(me.Expression, dcConst);

                                    if (e == expression)
                                    {
                                        expr = Expression.Call(
                                            Methods.Enumerable.ToList.MakeGenericMethod(childType),
                                            expr);
                                    }

                                    return expr;
                                }
                            }
                        }

                        break;
                    }
                }

                return e;
            }));
        }
示例#33
0
 public override string DescribeAction(Result other, IBuildContext ctxt)
 {
     return(String.Format("Copy {0} to {1} and make it executable",
                          ((MBFile)other).GetPath(ctxt), DestDir));
 }
示例#34
0
        // check that the result is valid. Return true if it is.
        // only meaningful for a result that is associated with
        // a resource stored external to the result cache; eg
        // an MBFile, etc.

        public virtual bool Check(IBuildContext ctxt)
        {
            return(true);
        }
示例#35
0
        // clone the result to the 'dist' directory,
        // using the DistPath function in ctxt. Again, a noop
        // unless the result is stored external to the result
        // cache. Return true if anything was done.

        public virtual bool DistClone(IBuildContext ctxt)
        {
            return(false);
        }
示例#36
0
 public ISqlExpression GetSubQuery(IBuildContext context)
 {
     return(null);
 }
示例#37
0
 public BuildInfo(IBuildContext parent, Expression expression, SelectQuery selectQuery)
 {
     Parent      = parent;
     Expression  = expression;
     SelectQuery = selectQuery;
 }
示例#38
0
        Expression CorrectConditional(IBuildContext context, Expression expr, bool enforceServerSide, string?alias)
        {
            if (expr.NodeType != ExpressionType.Conditional)
            {
                return(BuildExpression(context, expr, enforceServerSide, alias));
            }

            var cond = (ConditionalExpression)expr;

            if (cond.Test.NodeType == ExpressionType.Equal || cond.Test.NodeType == ExpressionType.NotEqual)
            {
                var b = (BinaryExpression)cond.Test;

                Expression?cnt = null;
                Expression?obj = null;

                if (IsNullConstant(b.Left))
                {
                    cnt = b.Left;
                    obj = b.Right;
                }
                else if (IsNullConstant(b.Right))
                {
                    cnt = b.Right;
                    obj = b.Left;
                }

                if (cnt != null)
                {
                    var objContext = GetContext(context, obj);
                    if (objContext != null && objContext.IsExpression(obj, 0, RequestFor.Object).Result)
                    {
                        var sql = objContext.ConvertToSql(obj, 0, ConvertFlags.Key);
                        if (sql.Length == 0)
                        {
                            sql = objContext.ConvertToSql(obj, 0, ConvertFlags.All);
                        }

                        if (sql.Length > 0)
                        {
                            Expression?predicate = null;
                            foreach (var f in sql)
                            {
                                if (f.Sql is SqlField field && field.Table !.All == field)
                                {
                                    continue;
                                }

                                var valueType = f.Sql.SystemType !;

                                if (!valueType.IsNullable() && valueType.IsValueType)
                                {
                                    valueType = typeof(Nullable <>).MakeGenericType(valueType);
                                }

                                var reader     = BuildSql(context, f.Sql, valueType, null);
                                var comparison = Expression.MakeBinary(cond.Test.NodeType,
                                                                       Expression.Default(valueType), reader);

                                predicate = predicate == null
                                                                        ? comparison
                                                                        : Expression.MakeBinary(
                                    cond.Test.NodeType == ExpressionType.Equal
                                                                                        ? ExpressionType.AndAlso
                                                                                        : ExpressionType.OrElse, predicate, comparison);
                            }

                            if (predicate != null)
                            {
                                cond = cond.Update(predicate,
                                                   CorrectConditional(context, cond.IfTrue, enforceServerSide, alias),
                                                   CorrectConditional(context, cond.IfFalse, enforceServerSide, alias));
                            }
                        }
                    }
                }
            }

            if (cond == expr)
            {
                expr = BuildExpression(context, expr, enforceServerSide, alias);
            }
            else
            {
                expr = cond;
            }

            return(expr);
        }
        TransformInfo TransformExpression(IBuildContext context, Expression expr, bool enforceServerSide)
        {
            if (_skippedExpressions.Contains(expr))
            {
                return(new TransformInfo(expr, true));
            }

            if (expr.Find(IsNoneSqlMember) != null)
            {
                return(new TransformInfo(expr));
            }

            switch (expr.NodeType)
            {
            case ExpressionType.Convert:
            case ExpressionType.ConvertChecked:
            {
                if (expr.Type == typeof(object))
                {
                    break;
                }

                var cex = (UnaryExpression)expr;

                _convertedExpressions.Add(cex.Operand, cex);

                var nex = BuildExpression(context, cex.Operand, enforceServerSide);

                if (nex.Type != cex.Type)
                {
                    nex = cex.Update(nex);
                }

                var ret = new TransformInfo(nex, true);

                _convertedExpressions.Remove(cex.Operand);

                return(ret);
            }

            case ExpressionType.MemberAccess:
            {
                if (IsServerSideOnly(expr) || PreferServerSide(expr, enforceServerSide))
                {
                    return(new TransformInfo(BuildSql(context, expr)));
                }

                var ma = (MemberExpression)expr;

                var l = Expressions.ConvertMember(MappingSchema, ma.Expression == null ? null : ma.Expression.Type, ma.Member);
                if (l != null)
                {
                    // In Grouping KeyContext we have to perform calculation on server side
                    if (Contexts.Any(c => c is GroupByBuilder.KeyContext))
                    {
                        return(new TransformInfo(BuildSql(context, expr)));
                    }
                    break;
                }

                if (ma.Member.IsNullableValueMember())
                {
                    break;
                }

                if (ma.Member.IsNullableHasValueMember())
                {
                    Expression e = Expression.NotEqual(
                        ma.Expression, Expression.Constant(null, ma.Expression.Type));

                    return(new TransformInfo(
                               BuildExpression(
                                   context,
                                   ma.Expression.Type.IsPrimitiveEx() ?
                                   Expression.Call(
                                       MemberHelper.MethodOf(() => Sql.AsSql(true)),
                                       e) :
                                   e, enforceServerSide),
                               true));
                }

                var ctx = GetContext(context, ma);

                if (ctx != null)
                {
                    if (ma.Type.IsGenericTypeEx() && typeof(IEnumerable <>).IsSameOrParentOf(ma.Type))
                    {
                        var res = ctx.IsExpression(ma, 0, RequestFor.Association);

                        if (res.Result)
                        {
                            var table = (TableBuilder.AssociatedTableContext)res.Context;
                            if (table.IsList)
                            {
                                var mexpr = GetMultipleQueryExpression(context, MappingSchema, ma, new HashSet <ParameterExpression>());
                                return(new TransformInfo(BuildExpression(context, mexpr, enforceServerSide)));
                            }
                        }
                    }

                    return(new TransformInfo(ctx.BuildExpression(ma, 0, enforceServerSide)));
                }

                var ex = ma.Expression;

                while (ex is MemberExpression)
                {
                    ex = ((MemberExpression)ex).Expression;
                }

                if (ex is MethodCallExpression)
                {
                    var ce = (MethodCallExpression)ex;

                    if (IsSubQuery(context, ce))
                    {
                        if (!IsMultipleQuery(ce))
                        {
                            var info = GetSubQueryContext(context, ce);
                            var par  = Expression.Parameter(ex.Type);
                            var bex  = info.Context.BuildExpression(ma.Transform(e => e == ex ? par : e), 0, enforceServerSide);

                            if (bex != null)
                            {
                                return(new TransformInfo(bex));
                            }
                        }
                    }
                }

                ex = ma.Expression;

                if (ex != null && ex.NodeType == ExpressionType.Constant)
                {
                    // field = localVariable
                    //
                    var c = _expressionAccessors[ex];
                    return(new TransformInfo(Expression.MakeMemberAccess(Expression.Convert(c, ex.Type), ma.Member)));
                }

                break;
            }

            case ExpressionType.Parameter:
            {
                if (expr == ParametersParam)
                {
                    break;
                }

                var ctx = GetContext(context, expr);

                if (ctx != null)
                {
                    return(new TransformInfo(ctx.BuildExpression(expr, 0, enforceServerSide)));
                }

                break;
            }

            case ExpressionType.Constant:
            {
                if (expr.Type.IsConstantable())
                {
                    break;
                }

                if (_expressionAccessors.ContainsKey(expr))
                {
                    return(new TransformInfo(Expression.Convert(_expressionAccessors[expr], expr.Type)));
                }

                break;
            }

            case ExpressionType.Coalesce:

                if (expr.Type == typeof(string) && MappingSchema.GetDefaultValue(typeof(string)) != null)
                {
                    return(new TransformInfo(BuildSql(context, expr)));
                }

                if (CanBeTranslatedToSql(context, ConvertExpression(expr), true))
                {
                    return(new TransformInfo(BuildSql(context, expr)));
                }

                break;

            case ExpressionType.Conditional:

                if (CanBeTranslatedToSql(context, ConvertExpression(expr), true))
                {
                    return(new TransformInfo(BuildSql(context, expr)));
                }
                break;

            case ExpressionType.Call:
            {
                var ce = (MethodCallExpression)expr;

                if (IsGroupJoinSource(context, ce))
                {
                    foreach (var arg in ce.Arguments.Skip(1))
                    {
                        if (!_skippedExpressions.Contains(arg))
                        {
                            _skippedExpressions.Add(arg);
                        }
                    }

                    if (IsSubQuery(context, ce))
                    {
                        if (ce.IsQueryable())
                        //if (!typeof(IEnumerable).IsSameOrParentOf(expr.Type) || expr.Type == typeof(string) || expr.Type.IsArray)
                        {
                            var ctx = GetContext(context, expr);

                            if (ctx != null)
                            {
                                return(new TransformInfo(ctx.BuildExpression(expr, 0, enforceServerSide)));
                            }
                        }
                    }

                    break;
                }

                if (ce.IsAssociation(MappingSchema))
                {
                    var ctx = GetContext(context, ce);
                    if (ctx == null)
                    {
                        throw new InvalidOperationException();
                    }

                    return(new TransformInfo(ctx.BuildExpression(ce, 0, enforceServerSide)));
                }

                if ((_buildMultipleQueryExpressions == null || !_buildMultipleQueryExpressions.Contains(ce)) && IsSubQuery(context, ce))
                {
                    if (IsMultipleQuery(ce))
                    {
                        return(new TransformInfo(BuildMultipleQuery(context, ce, enforceServerSide)));
                    }

                    return(new TransformInfo(GetSubQueryExpression(context, ce, enforceServerSide)));
                }

                if (IsServerSideOnly(expr) || PreferServerSide(expr, enforceServerSide) || ce.Method.IsSqlPropertyMethodEx())
                {
                    return(new TransformInfo(BuildSql(context, expr)));
                }
            }

            break;
            }

            if (EnforceServerSide(context))
            {
                switch (expr.NodeType)
                {
                case ExpressionType.MemberInit:
                case ExpressionType.New:
                case ExpressionType.Convert:
                    break;

                default:
                    if (CanBeCompiled(expr))
                    {
                        break;
                    }
                    return(new TransformInfo(BuildSql(context, expr)));
                }
            }

            return(new TransformInfo(expr));
        }
        public Expression GetSubQueryExpression(IBuildContext context, MethodCallExpression expr, bool enforceServerSide)
        {
            var info = GetSubQueryContext(context, expr);

            return(info.Expression ?? (info.Expression = info.Context.BuildExpression(null, 0, enforceServerSide)));
        }
 static bool EnforceServerSide(IBuildContext context)
 {
     return(context.SelectQuery.Select.IsDistinct);
 }
示例#42
0
        public override int ConvertToParentIndex(int index, IBuildContext context)
        {
            var idx = GetIndex(context.Select.Select.Columns[index]);

            return(Parent == null ? idx : Parent.ConvertToParentIndex(idx, this));
        }
示例#43
0
 public KeyContext(IBuildContext parent, LambdaExpression lambda, params IBuildContext[] sequences)
     : base(parent, lambda, sequences)
 {
 }
示例#44
0
 public SelectManyContext(IBuildContext parent, LambdaExpression lambda, IBuildContext sequence)
     : base(parent, lambda, sequence)
 {
 }
        public Expression BuildExpression(IBuildContext context, Expression expression, bool enforceServerSide)
        {
            var newExpr = expression.Transform(expr => TransformExpression(context, expr, enforceServerSide));

            return(newExpr);
        }
示例#46
0
 public AllAnyContext(IBuildContext parent, MethodCallExpression methodCall, IBuildContext sequence)
     : base(parent, sequence, null)
 {
     _methodCall = methodCall;
 }
示例#47
0
        TransformInfo TransformExpression(IBuildContext context, Expression expr, bool enforceServerSide, string?alias)
        {
            if (_skippedExpressions.Contains(expr))
            {
                return(new TransformInfo(expr, true));
            }

            alias ??= _optimizationContext.GetExpressionAlias(expr);

            switch (expr.NodeType)
            {
            case ExpressionType.Convert:
            case ExpressionType.ConvertChecked:
            {
                if (expr.Type == typeof(object))
                {
                    break;
                }

                var cex = (UnaryExpression)expr;

                _convertedExpressions.Add(cex.Operand, cex);

                var newOperand = BuildExpression(context, cex.Operand, enforceServerSide);

                if (newOperand.Type != cex.Type)
                {
                    if (cex.Type.IsNullable() && newOperand is ConvertFromDataReaderExpression readerExpression)
                    {
                        newOperand = readerExpression.MakeNullable();
                    }

                    newOperand = cex.Update(newOperand);
                }
                var ret = new TransformInfo(newOperand, true);

                RemoveConvertedExpression(cex.Operand);

                return(ret);
            }

            case ExpressionType.MemberAccess:
            {
                var ma = (MemberExpression)expr;

                if (IsServerSideOnly(ma) || PreferServerSide(ma, enforceServerSide) && !HasNoneSqlMember(ma))
                {
                    return(new TransformInfo(BuildSql(context, expr, alias)));
                }

                var l = Expressions.ConvertMember(MappingSchema, ma.Expression?.Type, ma.Member);
                if (l != null)
                {
                    // In Grouping KeyContext we have to perform calculation on server side
                    if (Contexts.Any(c => c is GroupByBuilder.KeyContext))
                    {
                        return(new TransformInfo(BuildSql(context, expr, alias)));
                    }
                    break;
                }

                if (ma.Member.IsNullableValueMember())
                {
                    break;
                }

                var ctx = GetContext(context, ma);

                if (ctx != null)
                {
                    var prevCount  = ctx.SelectQuery.Select.Columns.Count;
                    var expression = ctx.BuildExpression(ma, 0, enforceServerSide);

                    if (expression.NodeType == ExpressionType.Extension && expression is DefaultValueExpression &&
                        ma.Expression?.NodeType == ExpressionType.Parameter)
                    {
                        var objExpression = BuildExpression(ctx, ma.Expression, enforceServerSide, alias);
                        var varTempVar    = objExpression.NodeType == ExpressionType.Parameter
                                                                        ? objExpression
                                                                        : BuildVariable(objExpression, ((ParameterExpression)ma.Expression).Name);

                        var condition = Expression.Condition(
                            Expression.Equal(varTempVar,
                                             new DefaultValueExpression(MappingSchema, ma.Expression.Type)), expression,
                            Expression.MakeMemberAccess(varTempVar, ma.Member));
                        expression = condition;
                    }
                    else if (!alias.IsNullOrEmpty() && (ctx.SelectQuery.Select.Columns.Count - prevCount) == 1)
                    {
                        ctx.SelectQuery.Select.Columns[ctx.SelectQuery.Select.Columns.Count - 1].Alias = alias;
                    }
                    return(new TransformInfo(expression));
                }

                var ex = ma.Expression;

                while (ex is MemberExpression memberExpression)
                {
                    ex = memberExpression.Expression;
                }

                if (ex is MethodCallExpression ce)
                {
                    if (IsSubQuery(context, ce))
                    {
                        if (!IsMultipleQuery(ce, context.Builder.MappingSchema))
                        {
                            var info = GetSubQueryContext(context, ce);
                            if (alias != null)
                            {
                                info.Context.SetAlias(alias);
                            }
                            var par = Expression.Parameter(ex.Type);
                            var bex = info.Context.BuildExpression(ma.Transform(e => e == ex ? par : e), 0, enforceServerSide);

                            if (bex != null)
                            {
                                return(new TransformInfo(bex));
                            }
                        }
                    }
                }

                ex = ma.Expression;

                if (ex != null && ex.NodeType == ExpressionType.Constant)
                {
                    // field = localVariable
                    //
                    if (!_expressionAccessors.TryGetValue(ex, out var c))
                    {
                        return(new TransformInfo(ma));
                    }
                    return(new TransformInfo(Expression.MakeMemberAccess(Expression.Convert(c, ex.Type), ma.Member)));
                }

                break;
            }

            case ExpressionType.Parameter:
            {
                if (expr == ParametersParam || expr == PreambleParam)
                {
                    break;
                }

                var ctx = GetContext(context, expr);

                if (ctx != null)
                {
                    var buildExpr = ctx.BuildExpression(expr, 0, enforceServerSide);
                    if (buildExpr.Type != expr.Type)
                    {
                        buildExpr = Expression.Convert(buildExpr, expr.Type);
                    }
                    return(new TransformInfo(buildExpr));
                }

                break;
            }

            case ExpressionType.Constant:
            {
                if (expr.Type.IsConstantable(true))
                {
                    break;
                }

                if ((_buildMultipleQueryExpressions == null || !_buildMultipleQueryExpressions.Contains(expr)) && IsSequence(new BuildInfo(context, expr, new SelectQuery())))
                {
                    return(new TransformInfo(BuildMultipleQuery(context, expr, enforceServerSide)));
                }

                if (_expressionAccessors.TryGetValue(expr, out var accessor))
                {
                    return(new TransformInfo(Expression.Convert(accessor, expr.Type)));
                }

                break;
            }

            case ExpressionType.Coalesce:

                if (expr.Type == typeof(string) && MappingSchema.GetDefaultValue(typeof(string)) != null)
                {
                    return(new TransformInfo(BuildSql(context, expr, alias)));
                }

                if (CanBeTranslatedToSql(context, ConvertExpression(expr), true))
                {
                    return(new TransformInfo(BuildSql(context, expr, alias)));
                }

                break;

            case ExpressionType.Call:
            {
                var ce = (MethodCallExpression)expr;

                if (IsGroupJoinSource(context, ce))
                {
                    foreach (var arg in ce.Arguments.Skip(1))
                    {
                        if (!_skippedExpressions.Contains(arg))
                        {
                            _skippedExpressions.Add(arg);
                        }
                    }

                    if (IsSubQuery(context, ce))
                    {
                        if (ce.IsQueryable())
                        //if (!typeof(IEnumerable).IsSameOrParentOf(expr.Type) || expr.Type == typeof(string) || expr.Type.IsArray)
                        {
                            var ctx = GetContext(context, expr);

                            if (ctx != null)
                            {
                                return(new TransformInfo(ctx.BuildExpression(expr, 0, enforceServerSide)));
                            }
                        }
                    }

                    break;
                }

                if (ce.IsAssociation(MappingSchema))
                {
                    var ctx = GetContext(context, ce);
                    if (ctx == null)
                    {
                        throw new InvalidOperationException();
                    }

                    return(new TransformInfo(ctx.BuildExpression(ce, 0, enforceServerSide)));
                }

                if ((_buildMultipleQueryExpressions == null || !_buildMultipleQueryExpressions.Contains(ce)) && IsSubQuery(context, ce))
                {
                    if (IsMultipleQuery(ce, MappingSchema))
                    {
                        return(new TransformInfo(BuildMultipleQuery(context, ce, enforceServerSide)));
                    }

                    return(new TransformInfo(GetSubQueryExpression(context, ce, enforceServerSide, alias)));
                }

                if (IsServerSideOnly(expr) || PreferServerSide(expr, enforceServerSide) || ce.Method.IsSqlPropertyMethodEx())
                {
                    return(new TransformInfo(BuildSql(context, expr, alias)));
                }
            }

            break;

            case ExpressionType.New:
            {
                var ne = (NewExpression)expr;

                List <Expression>?arguments = null;
                for (var i = 0; i < ne.Arguments.Count; i++)
                {
                    var argument    = ne.Arguments[i];
                    var memberAlias = ne.Members?[i].Name;

                    var newArgument = ConvertAssignmentArgument(context, argument, ne.Members?[i], enforceServerSide, memberAlias);
                    if (newArgument != argument)
                    {
                        if (arguments == null)
                        {
                            arguments = ne.Arguments.Take(i).ToList();
                        }
                    }
                    arguments?.Add(newArgument);
                }

                if (arguments != null)
                {
                    ne = ne.Update(arguments);
                }

                return(new TransformInfo(ne, true));
            }

            case ExpressionType.MemberInit:
            {
                var mi      = (MemberInitExpression)expr;
                var newPart = (NewExpression)BuildExpression(context, mi.NewExpression, enforceServerSide);
                List <MemberBinding>?bindings = null;
                for (var i = 0; i < mi.Bindings.Count; i++)
                {
                    var binding    = mi.Bindings[i];
                    var newBinding = binding;
                    if (binding is MemberAssignment assignment)
                    {
                        var argument = ConvertAssignmentArgument(context, assignment.Expression,
                                                                 assignment.Member, enforceServerSide, assignment.Member.Name);
                        if (argument != assignment.Expression)
                        {
                            newBinding = Expression.Bind(assignment.Member, argument);
                        }
                    }

                    if (newBinding != binding)
                    {
                        if (bindings == null)
                        {
                            bindings = mi.Bindings.Take(i).ToList();
                        }
                    }

                    bindings?.Add(newBinding);
                }

                if (mi.NewExpression != newPart || bindings != null)
                {
                    mi = mi.Update(newPart, bindings ?? mi.Bindings.AsEnumerable());
                }

                return(new TransformInfo(mi, true));
            }
            }

            if (enforceServerSide || EnforceServerSide(context))
            {
                switch (expr.NodeType)
                {
                case ExpressionType.MemberInit:
                case ExpressionType.Convert:
                    break;

                default:
                    if (!enforceServerSide && CanBeCompiled(expr))
                    {
                        break;
                    }
                    return(new TransformInfo(BuildSql(context, expr, alias)));
                }
            }

            return(new TransformInfo(expr));
        }
示例#48
0
        // Fingerprinting -- an MD5 of the result's data.
        // Cached is a cached value of the fingerprint; the
        // result implementation may compare some saved hints
        // and return the cached value if deemed appropriate.
        //
        // It is acceptable if ctxt or cached is null. If cached
        // is null, the cache comparison should be skipped.
        //
        // If the result class needs a context to evaluate the fingerprint,
        // and ctxt is null, and the fingerprint is not cached,
        // throw an exception.

        public abstract Fingerprint GetFingerprint(IBuildContext ctxt, Fingerprint cached);
示例#49
0
 public override IQueryExpression GetSubQuery(IBuildContext context)
 {
     return(null);
 }
示例#50
0
 public int ConvertToParentIndex(int index, IBuildContext context)
 {
     return(Parent == null ? index : Parent.ConvertToParentIndex(index, this));
 }
示例#51
0
 public InsertOrUpdateContext(IBuildContext parent, IBuildContext sequence)
     : base(parent, sequence, null)
 {
 }
示例#52
0
文件: Query.cs 项目: ijsgaus/linq2db
 internal abstract void Init(IBuildContext parseContext, List <ParameterAccessor> sqlParameters);
示例#53
0
        // remove any external data associated with the Result.
        // returns true if any action was taken.

        public virtual bool Clean(IBuildContext ctxt)
        {
            return(false);
        }
示例#54
0
 public CountContext(IBuildContext parent, IBuildContext sequence, Type returnType)
     : base(parent, sequence, null)
 {
     _returnType = returnType;
 }
示例#55
0
        public static Expression?CorrectExpression(Expression?expression, IBuildContext current, IBuildContext underlying)
        {
            if (expression != null)
            {
                var root = current.Builder.GetRootObject(expression);
                if (root is ContextRefExpression refExpression)
                {
                    if (refExpression.BuildContext == current)
                    {
                        expression = expression.Replace(root, new ContextRefExpression(root.Type, underlying), EqualityComparer <Expression> .Default);
                    }
                }
            }

            return(expression);
        }
示例#56
0
 public BuildContext(IBuildContext parentContext)
 {
     ParentContext = parentContext ?? throw new ArgumentNullException(nameof(parentContext));
     BuildTarget   = parentContext.BuildTarget;
 }
示例#57
0
 public SubQueryContext(IBuildContext subQuery, bool addToSql = true)
     : this(subQuery, new SelectQuery {
     ParentSelect = subQuery.Select.ParentSelect
 }, addToSql)
 {
 }
示例#58
0
 public Expression Build(Expression expression, IBuildContext buildContext) =>
 // Add the Singleton lifetime for any instances
 buildContext.AddLifetime(expression, new Lifetimes.SingletonLifetime());
示例#59
0
 public OfTypeContext(IBuildContext context, MethodCallExpression methodCall)
     : base(context)
 {
     _methodCall = methodCall;
 }
        static Expression GetMultipleQueryExpression(IBuildContext context, MappingSchema mappingSchema, Expression expression, HashSet <ParameterExpression> parameters)
        {
            if (!Common.Configuration.Linq.AllowMultipleQuery)
            {
                throw new LinqException("Multiple queries are not allowed. Set the 'LinqToDB.Common.Configuration.Linq.AllowMultipleQuery' flag to 'true' to allow multiple queries.");
            }

            expression.Visit(e =>
            {
                if (e.NodeType == ExpressionType.Lambda)
                {
                    foreach (var p in ((LambdaExpression)e).Parameters)
                    {
                        parameters.Add(p);
                    }
                }
            });

            // Convert associations.
            //
            return(expression.Transform(e =>
            {
                switch (e.NodeType)
                {
                case ExpressionType.MemberAccess:
                    {
                        var root = e.GetRootObject(mappingSchema);

                        if (root != null &&
                            root.NodeType == ExpressionType.Parameter &&
                            !parameters.Contains((ParameterExpression)root))
                        {
                            var res = context.IsExpression(e, 0, RequestFor.Association);

                            if (res.Result)
                            {
                                var table = (TableBuilder.AssociatedTableContext)res.Context;

                                if (table.IsList)
                                {
                                    var ttype = typeof(Table <>).MakeGenericType(table.ObjectType);
                                    var tbl = Activator.CreateInstance(ttype, context.Builder.DataContext);
                                    var method = e == expression ?
                                                 MemberHelper.MethodOf <IEnumerable <bool> >(n => n.Where(a => a)).GetGenericMethodDefinition().MakeGenericMethod(table.ObjectType) :
                                                 _whereMethodInfo.MakeGenericMethod(e.Type, table.ObjectType, ttype);

                                    var me = (MemberExpression)e;
                                    var op = Expression.Parameter(table.ObjectType, "t");

                                    parameters.Add(op);

                                    Expression ex = null;

                                    for (var i = 0; i < table.Association.ThisKey.Length; i++)
                                    {
                                        var field1 = table.ParentAssociation.SqlTable.Fields[table.Association.ThisKey [i]];
                                        var field2 = table.SqlTable.Fields[table.Association.OtherKey[i]];

                                        var ma1 = Expression.MakeMemberAccess(op, field2.ColumnDescriptor.MemberInfo);
                                        var ma2 = Expression.MakeMemberAccess(me.Expression, field1.ColumnDescriptor.MemberInfo);

                                        var ee = Equal(mappingSchema, ma1, ma2);

                                        ex = ex == null ? ee : Expression.AndAlso(ex, ee);
                                    }

                                    var expr = Expression.Call(null, method, Expression.Constant(tbl), Expression.Lambda(ex, op));

                                    if (e == expression)
                                    {
                                        expr = Expression.Call(
                                            MemberHelper.MethodOf <IEnumerable <int> >(n => n.ToList()).GetGenericMethodDefinition().MakeGenericMethod(table.ObjectType),
                                            expr);
                                    }

                                    return expr;
                                }
                            }
                        }

                        break;
                    }
                }

                return e;
            }));
        }