public override object Execute(IContextProvider provider, object[] args, MemoryPool pool) { object[] keys = new object[m_params.Count + 1]; keys[0] = provider.Context; for (int k = 0; k < m_params.Count; k++) keys[k + 1] = pool.GetData(m_params[k]); Key key = new Key(QueryContext.Engine, keys); object res; lock (m_cache) { if (m_cache.TryGetValue(key, out res)) return res.CloneObject(); } res = m_body.Execute(provider, args, pool); lock (m_cache) { if (!m_cache.ContainsKey(key)) { key.CloneKeys(); m_cache.Add(key, res); } } return res.CloneObject(); }