예제 #1
0
        private static List <T> RetrieveFromDatabaseOrCache <T>(List <PrimaryKey> ids) where T : Entity
        {
            var cc = GetCacheController <T>();

            if (cc != null)
            {
                var filter = GetFilterQuery <T>();
                if (filter == null || filter.InMemoryFunction != null)
                {
                    List <T> result;

                    using (new EntityCache())
                        using (var rr = EntityCache.NewRetriever())
                        {
                            result = ids.Select(id => rr.Request <T>(id)).ToList();
                        }

                    if (filter != null)
                    {
                        result = result.Where(filter.InMemoryFunction).ToList();
                    }

                    return(result);
                }
            }

            return(ids.GroupsOf(Schema.Current.Settings.MaxNumberOfParameters).SelectMany(gr => Database.Query <T>().Where(a => gr.Contains(a.Id))).ToList());
        }
예제 #2
0
        public static T Retrieve <T>(PrimaryKey id) where T : Entity
        {
            using (HeavyProfiler.Log("DBRetrieve", () => typeof(T).TypeName()))
            {
                if (EntityCache.Created)
                {
                    T cached = EntityCache.Get <T>(id);

                    if (cached != null)
                    {
                        return(cached);
                    }
                }

                var alternateEntity = Schema.Current.OnAlternativeRetriving(typeof(T), id);
                if (alternateEntity != null)
                {
                    return((T)alternateEntity);
                }

                var cc = GetCacheController <T>();
                if (cc != null)
                {
                    var filter = GetFilterQuery <T>();
                    if (filter == null || filter.InMemoryFunction != null)
                    {
                        T result;
                        using (new EntityCache())
                            using (var r = EntityCache.NewRetriever())
                            {
                                result = r.Request <T>(id);
                            }

                        if (filter != null && !filter.InMemoryFunction(result))
                        {
                            throw new EntityNotFoundException(typeof(T), id);
                        }

                        return(result);
                    }
                }

                T retrieved = Database.Query <T>().SingleOrDefaultEx(a => a.Id == id);

                if (retrieved == null)
                {
                    throw new EntityNotFoundException(typeof(T), id);
                }

                return(retrieved);
            }
        }
예제 #3
0
        public static List <T> RetrieveAll <T>()
            where T : Entity
        {
            try
            {
                using (HeavyProfiler.Log("DBRetrieve", () => "All {0}".FormatWith(typeof(T).TypeName())))
                {
                    var cc = GetCacheController <T>();
                    if (cc != null)
                    {
                        var filter = GetFilterQuery <T>();
                        if (filter == null || filter.InMemoryFunction != null)
                        {
                            List <T> result;
                            using (new EntityCache())
                                using (var r = EntityCache.NewRetriever())
                                {
                                    result = cc.GetAllIds().Select(id => r.Request <T>(id)).ToList();
                                }

                            if (filter != null)
                            {
                                result = result.Where(filter.InMemoryFunction).ToList();
                            }

                            return(result);
                        }
                    }

                    return(Database.Query <T>().ToList());
                }
            }
            catch (Exception e)
            {
                e.Data["type"] = typeof(T).TypeName();
                throw;
            }
        }