public void RequestItem(ItemKey itemKey)
        {
            if (itemKey.TypeId == 0)
            {
                return;
            }
            if (!typesAccessed.ContainsKey(itemKey.TypeId))
            {
                // We need to make sure that the application is loaded
                if (itemKey.GetType(core).ApplicationId > 0)
                {
                    core.ItemCache.RegisterType(typeof(ApplicationEntry));

                    ItemKey applicationKey = new ItemKey(itemKey.GetType(core).ApplicationId, ItemType.GetTypeId(core, typeof(ApplicationEntry)));
                    core.ItemCache.RequestItem(applicationKey);

                    ApplicationEntry ae = (ApplicationEntry)core.ItemCache[applicationKey];

                    typesAccessed.Add(itemKey.TypeId, ae.Assembly.GetType(itemKey.GetType(core).TypeNamespace));
                }
                else
                {
                    try
                    {
                        typesAccessed.Add(itemKey.TypeId, Type.GetType(itemKey.GetType(core).TypeNamespace));
                    }
                    catch
                    {
                        HttpContext.Current.Response.Write(itemKey.ToString());
                        HttpContext.Current.Response.End();
                    }
                }
            }
            NumberedItemId loadedId = new NumberedItemId(itemKey.Id, itemKey.TypeId);
            if (!(batchedItemIds.Contains(loadedId) || itemsCached.ContainsKey(loadedId)))
            {
                batchedItemIds.Add(loadedId);
            }
        }
        private void loadItems(long typeId, List<NumberedItemId> itemIds)
        {
            List<long> itemId = new List<long>(20);

            foreach (NumberedItemId id in itemIds)
            {
                if (id.TypeId == typeId)
                {
                    itemId.Add(id.Id);
                }
            }

            Type typeToGet;

            typeToGet = typesAccessed[typeId];

            if (typeToGet != null)
            {
                SelectQuery query;

            #if DEBUG
                Stopwatch timer = new Stopwatch();
                timer.Start();
            #endif
                bool dataReader = false;

                ConstructorInfo[] constructors = typeToGet.GetConstructors();

                // temporary
                foreach (ConstructorInfo constructor in constructors)
                {
                    ParameterInfo[] parameters = constructor.GetParameters();
                    if (parameters.Length >= 2)
                    {
                        if (parameters[1].ParameterType == typeof(System.Data.Common.DbDataReader))
                        {
                            dataReader = true;
                            break;
                        }
                    }
                }
                // end temporary
            #if DEBUG
                timer.Stop();
                if (HttpContext.Current != null)
                {
                    //HttpContext.Current.Response.Write(string.Format("<!-- Constructor {1} found in {0} -->\r\n", timer.ElapsedTicks / 10000000.0, typeToGet.Name));
                }
            #endif

                if (typeToGet.GetMethod(typeToGet.Name + "_GetSelectQueryStub", new Type[] { typeof(Core) }) != null)
                {
                    query = (SelectQuery)typeToGet.InvokeMember(typeToGet.Name + "_GetSelectQueryStub", BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod, null, null, new object[] { core }); //GetSelectQueryStub(typeToGet);
                }
                else if (typeToGet.GetMethod(typeToGet.Name + "_GetSelectQueryStub", Type.EmptyTypes) != null)
                {
                    query = (SelectQuery)typeToGet.InvokeMember(typeToGet.Name + "_GetSelectQueryStub", BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod, null, null, new object[] { }); //GetSelectQueryStub(typeToGet);
                }
                else
                {
                    query = Item.GetSelectQueryStub(core, typeToGet);
                }

                query.AddCondition(Item.GetTable(typeToGet) + "." + Item.GetPrimaryKey(core, typeToGet), ConditionEquality.In, itemId);

                if (dataReader)
                {
                    System.Data.Common.DbDataReader reader = core.Db.ReaderQuery(query);

                    while (reader.Read())
                    {
                        // this may seem counter intuitive, but the items self-cache through the RegisterItem(NumberedItem) method
                        NumberedItem item = Activator.CreateInstance(typeToGet, new object[] { core, reader }) as NumberedItem;

                        NumberedItemId loadedId = new NumberedItemId(item.Id, ItemType.GetTypeId(core, typeToGet));
                        batchedItemIds.Remove(loadedId);
                    }

                    reader.Close();
                    reader.Dispose();
                }
                else
                {
                    DataTable itemsTable = db.Query(query);

                    foreach (DataRow dr in itemsTable.Rows)
                    {
                        // this may seem counter intuitive, but the items self-cache through the RegisterItem(NumberedItem) method
                        NumberedItem item = Activator.CreateInstance(typeToGet, new object[] { core, dr }) as NumberedItem;

                        NumberedItemId loadedId = new NumberedItemId(item.Id, ItemType.GetTypeId(core, typeToGet));
                        batchedItemIds.Remove(loadedId);
                    }
                }

                if (itemsPersisted != null)
                {
                    core.Cache.SetCached("NumberedItems", itemsPersisted, new TimeSpan(1, 0, 0), CacheItemPriority.Default);
                }
            }
        }
        public void RegisterItem(NumberedItem item)
        {
            try
            {
                long id = item.Id;
            }
            catch (NotImplementedException)
            {
                // Cannot cache this item
            }
            NumberedItemId itemKey = new NumberedItemId(item.Id, item.ItemKey.TypeId);

            if (itemKey.TypeId == 0)
            {
                return;
            }
            if (!typesAccessed.ContainsKey(itemKey.TypeId))
            {
                typesAccessed.Add(itemKey.TypeId, item.GetType());
            }

            if (!(itemsCached.ContainsKey(itemKey)))
            {
                itemsCached.Add(itemKey, item);
            }

            /*Type typeToGet;

            typeToGet = typesAccessed[itemKey.TypeId];

            if (typeToGet != null && itemsPersisted != null && typeToGet.GetCustomAttributes(typeof(CacheableAttribute), false).Length > 0)
            {
                lock (itemsPersistedLock)
                {
                    if (!(itemsPersisted.ContainsKey(itemKey)))
                    {
                        itemsPersisted.Add(itemKey, item);
                    }
                }
            }*/
            batchedItemIds.Remove(itemKey);
        }