private IQueryable<WebMachine> ApplyMachineSearchCriteria(IQueryable<WebMachine> query, MachineSearchCriteria machineSearchCriteria)
        {
            if (machineSearchCriteria != null)
            {
                string serverLanguage = null;
                string hostArch = null;
                string skuType = null;
                string ndpVersion = null;
                string iisVersion = null;
                string ready = null;

                serverLanguage = MapLabServerLanguageToString(machineSearchCriteria.ServerLanguage);
                skuType = MapLabSkuToString(machineSearchCriteria.SkuType);
                ready = MapBooleanValueToString(machineSearchCriteria.Ready);
                if (machineSearchCriteria.ArchType != null)
                {
                    hostArch = machineSearchCriteria.ArchType.ToString();
                }

                if (machineSearchCriteria.InternetInformationServerMajorVersion != null)
                {
                    iisVersion = MapInternetInformationServerVersionToString(machineSearchCriteria.InternetInformationServerMajorVersion);
                }

                ndpVersion = machineSearchCriteria.FrameworkVersion;

                this.machinesToAvoid = new string[0] { };
                if (machineSearchCriteria != null)
                {
                    this.machinesToAvoid = machineSearchCriteria.MachinesToAvoid.ToArray();
                }

                if (serverLanguage != null)
                {
                    query = query.Where(m => m.Locale == serverLanguage);
                }

                if (hostArch != null)
                {
                    query = query.Where(m => m.Arch == hostArch);
                }

                if (iisVersion != null)
                {
                    query = query.Where(m => m.InternetInformationMajorServerVersion == iisVersion);
                }

                if (ready != null)
                {
                    query = query.Where(m => m.Ready == ready);
                }

                if (skuType != null)
                {
                    query = query.Where(m => m.Sku == skuType);
                }

                if (ndpVersion != null)
                {
                    query = query.Where(m => m.Build == ndpVersion);
                }
            }

            return query;
        }
        /// <summary>
        /// Begins looking for a WebServer
        /// </summary>
        /// <param name="machineSearchCriteria">Machine specific criteria</param>
        /// <param name="astoriaMachineSearchCriteria">Astoria specific criteria</param>
        /// <param name="callback">WebServer return results</param>
        public void BeginLookup(
            MachineSearchCriteria machineSearchCriteria, 
            AstoriaMachineSearchCriteria astoriaMachineSearchCriteria, 
            EventHandler<WebServerLocatorCompleteEventArgs> callback)
        {
            if (callback == null)
            {
                throw new TaupoArgumentNullException("callback");
            }

            this.IsComplete = false;
            this.callBack = callback;

            IQueryable<WebMachine> machinesQuery = this.strategy.WebServersQueryRoot;

            machinesQuery = this.ApplyMachineSearchCriteria(machinesQuery, machineSearchCriteria);

            machinesQuery = this.ApplyAstoriaMachineCriteria(machinesQuery, astoriaMachineSearchCriteria);

            machinesQuery = machinesQuery.OrderBy(m => m.LastUsed);
            this.strategy.BeginExecute(this.OnQueryComplete, machinesQuery);
        }