public override IMember GetByVersion(Guid versionId) { var sql = GetBaseQuery(false); sql.Where("cmsContentVersion.VersionId = @VersionId", new { VersionId = versionId }); sql.OrderByDescending <ContentVersionDto>(x => x.VersionDate); var dto = Database.Fetch <MemberDto, ContentVersionDto, ContentDto, NodeDto>(sql).FirstOrDefault(); if (dto == null) { return(null); } var memberType = _memberTypeRepository.Get(dto.ContentVersionDto.ContentDto.ContentTypeId); var factory = new MemberFactory(memberType, NodeObjectTypeId, dto.NodeId); var media = factory.BuildEntity(dto); var properties = GetPropertyCollection(sql, new[] { new DocumentDefinition(dto.NodeId, dto.ContentVersionDto.VersionId, media.UpdateDate, media.CreateDate, memberType) }); media.Properties = properties[dto.NodeId]; //on initial construction we don't want to have dirty properties tracked // http://issues.umbraco.org/issue/U4-1946 ((Entity)media).ResetDirtyProperties(false); return(media); }
/// <summary> /// This is the underlying method that processes most queries for this repository /// </summary> /// <param name="sqlFull"> /// The full SQL to select all member data /// </param> /// <param name="pagingSqlQuery"> /// The Id SQL to just return all member ids - used to process the properties for the member item /// </param> /// <param name="withCache"></param> /// <returns></returns> private IEnumerable <IMember> ProcessQuery(Sql sqlFull, PagingSqlQuery pagingSqlQuery, bool withCache = false) { // fetch returns a list so it's ok to iterate it in this method var dtos = Database.Fetch <MemberDto, ContentVersionDto, ContentDto, NodeDto>(sqlFull); //This is a tuple list identifying if the content item came from the cache or not var content = new List <Tuple <IMember, bool> >(); var defs = new DocumentDefinitionCollection(); foreach (var dto in dtos) { // if the cache contains the item, use it if (withCache) { var cached = IsolatedCache.GetCacheItem <IMember>(GetCacheIdKey <IMember>(dto.NodeId)); //only use this cached version if the dto returned is the same version - this is just a safety check, members dont //store different versions, but just in case someone corrupts some data we'll double check to be sure. if (cached != null && cached.Version == dto.ContentVersionDto.VersionId) { content.Add(new Tuple <IMember, bool>(cached, true)); continue; } } // else, need to fetch from the database // content type repository is full-cache so OK to get each one independently var contentType = _memberTypeRepository.Get(dto.ContentVersionDto.ContentDto.ContentTypeId); // need properties if (defs.AddOrUpdate(new DocumentDefinition(dto.ContentVersionDto, contentType))) { content.Add(new Tuple <IMember, bool>(MemberFactory.BuildEntity(dto, contentType), false)); } } // load all properties for all documents from database in 1 query var propertyData = GetPropertyCollection(pagingSqlQuery, defs); // assign property data foreach (var contentItem in content) { var cc = contentItem.Item1; var fromCache = contentItem.Item2; //if this has come from cache, we do not need to build up it's structure if (fromCache) { continue; } cc.Properties = propertyData[cc.Version]; //on initial construction we don't want to have dirty properties tracked // http://issues.umbraco.org/issue/U4-1946 cc.ResetDirtyProperties(false); } return(content.Select(x => x.Item1).ToArray()); }
/// <summary> /// Private method to create a member object from a MemberDto /// </summary> /// <param name="dto"></param> /// <param name="contentType"></param> /// <param name="propCollection"></param> /// <returns></returns> private IMember CreateMemberFromDto(MemberDto dto, IMemberType contentType, PropertyCollection propCollection) { var factory = new MemberFactory(contentType, NodeObjectTypeId, dto.ContentVersionDto.NodeId); var member = factory.BuildEntity(dto); member.Properties = propCollection; //on initial construction we don't want to have dirty properties tracked // http://issues.umbraco.org/issue/U4-1946 ((Entity)member).ResetDirtyProperties(false); return(member); }
/// <summary> /// Private method to create a member object from a MemberDto /// </summary> /// <param name="dto"></param> /// <param name="versionId"></param> /// <param name="docSql"></param> /// <returns></returns> private IMember CreateMemberFromDto(MemberDto dto, Guid versionId, Sql docSql) { var memberType = _memberTypeRepository.Get(dto.ContentVersionDto.ContentDto.ContentTypeId); var factory = new MemberFactory(memberType, NodeObjectTypeId, dto.ContentVersionDto.NodeId); var member = factory.BuildEntity(dto); var docDef = new DocumentDefinition(dto.ContentVersionDto.NodeId, versionId, member.UpdateDate, member.CreateDate, memberType); var properties = GetPropertyCollection(docSql, new[] { docDef }); member.Properties = properties[dto.ContentVersionDto.NodeId]; //on initial construction we don't want to have dirty properties tracked // http://issues.umbraco.org/issue/U4-1946 ((Entity)member).ResetDirtyProperties(false); return(member); }