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()); }
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); } }
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; } }