/// <summary> /// Turn a query model into code. /// </summary> /// <param name="queryModel"></param> private void VisitQueryModelNoCache(QueryModel queryModel) { // Cache the referenced query expressions and restore them at the end. var cachedReferencedQS = _codeContext.GetAndResetQuerySourceLookups(); // Protect against all returns... try { // // If the query model is something that is trivial, then // perhaps there is a short-cut we can take? // if (queryModel.IsIdentityQuery() && queryModel.ResultOperators.Count == 1) { var ro = queryModel.ResultOperators[0]; var processor = _operators.FindScalarROProcessor(ro.GetType()); if (processor != null) { var result = processor.ProcessIdentityQuery(ro, queryModel, _codeEnv, _codeContext, MEFContainer); if (result != null && result.Item1) { Debug.WriteLine("Identity Query being processed"); _codeEnv.SetResult(result.Item2); return; } } } // Have we seen this query model before? If so, perhaps we can just short-circuit this? var cachedResult = _codeContext.GetReplacement(queryModel); if (cachedResult != null) { var context = _codeEnv.FirstAllInScopeFromNow(FindDeclarableParameters.FindAll(cachedResult)); if (context != null) { _codeEnv.SetResult(cachedResult); return; } } // If we drop through here, then let the full machinery parse the thing base.VisitQueryModel(queryModel); } finally { _codeContext.RestoreQuerySourceLookups(cachedReferencedQS); } }