public virtual TY Select <T, TY>(Guid id) where TY : Dwarf <TY>, new() { if (typeof(TY).Implements <ICompositeId>()) { throw new InvalidOperationException("Use SelectReferencing for CompositeId types"); } var command = new QueryBuilderLight().Select <TY>().From <TY>().Where <TY>("Id", id).ToQuery(true); TY result; if (!typeof(TY).Implements <ICacheless>() && CacheManager.TryGetCache(id, out result)) { return(result); } var sdr = ExecuteReader <T, TY>(command); try { result = sdr.Read() ? TupleToObject <TY>(sdr) : null; } catch (Exception e) { DwarfContext <T> .GetConfiguration().ErrorLogService.Logg(e); throw new DatabaseOperationException(e.Message, e); } finally { sdr.Close(); } return(typeof(TY).Implements <ICacheless>() ? result : CacheManager.SetCache(id, result)); }
/// <summary> ///Inserts two foreign key refernces into a mapping tables /// </summary> public virtual List <T> SelectManyToMany <T>(IDwarf owner, string alternateTableName = null) where T : Dwarf <T>, new() { if (owner == null || !owner.IsSaved) { return(new List <T>()); } var targetType = typeof(T); var ownerType = owner.GetType(); var tableName = ManyToManyAttribute.GetManyToManyTableName(targetType, ownerType, alternateTableName); var command = new QueryBuilderLight().Select <T>() .From <T>() .InnerJoin("[" + tableName + "] ON [" + tableName + "].[" + targetType.Name + "Id] = [" + targetType.Name + "].[Id]") .Where("[" + tableName + "].[" + ownerType.Name + "Id]", owner.Id, ownerType).ToQuery(); if (!typeof(T).Implements <ICacheless>()) { var cache = CacheManager.GetCacheList <T>(command); if (cache != null) { return(cache); } } var sdr = ExecuteReader <T>(command); var result = new List <T>(); try { while (sdr.Read()) { result.Add(TupleToObject <T>(sdr)); } } catch (Exception e) { DwarfContext <T> .GetConfiguration().ErrorLogService.Logg(e); throw new DatabaseOperationException(e.Message, e); } finally { sdr.Close(); } return(typeof(T).Implements <ICacheless>() ? result : CacheManager.SetCacheList(command, result)); }