BetterCms.Module.Pages.Services.DefaultTagService.SaveMediaTags C# (CSharp) Метод

SaveMediaTags() публичный Метод

Saves the media tags.
public SaveMediaTags ( Media media, IList tags, IList &newTags ) : void
media Media The media.
tags IList The tags.
newTags IList The new tags.
Результат void
        public void SaveMediaTags(Media media, IList<string> tags, out IList<Tag> newTags)
        {
            var trimmedTags = new List<string>();
            if (tags != null)
            {
                foreach (var tag in tags)
                {
                    trimmedTags.Add(tag.Trim());
                }
            }

            newTags = new List<Tag>();

            Tag tagAlias = null;

            // Tags merge:
            var mediaTags = unitOfWork.Session
                .QueryOver<MediaTag>()
                .Where(t => !t.IsDeleted && t.Media.Id == media.Id)
                .JoinQueryOver(t => t.Tag, JoinType.InnerJoin)
                .Where(t => !t.IsDeleted)
                .List<MediaTag>();

            // Remove deleted tags:
            for (var i = mediaTags.Count - 1; i >= 0; i--)
            {
                var tag = trimmedTags.FirstOrDefault(s => s.ToLower() == mediaTags[i].Tag.Name.ToLower());
                if (tag == null)
                {
                    UpdateModifiedInformation(mediaTags[i]);
                    unitOfWork.Session.Delete(mediaTags[i]);
                }
            }

            // Add new tags:
            var tagsInsert = new List<string>();
            foreach (var tag in trimmedTags)
            {
                var existMediaTag = mediaTags.FirstOrDefault(mediaTag => mediaTag.Tag.Name.ToLower() == tag.ToLower());
                if (existMediaTag == null)
                {
                    tagsInsert.Add(tag);
                }
            }

            if (tagsInsert.Count <= 0)
            {
                return;
            }

            // Get existing tags:
            var existingTags = unitOfWork.Session.QueryOver(() => tagAlias)
                                                .Where(t => !t.IsDeleted)
                                                .Where(Restrictions.In(Projections.Property(() => tagAlias.Name), tagsInsert))
                                                .List<Tag>();

            foreach (var tag in tagsInsert)
            {
                var mediaTag = new MediaTag { Media = media };

                var existTag = existingTags.FirstOrDefault(t => t.Name.ToLower() == tag.ToLower());
                if (existTag != null)
                {
                    mediaTag.Tag = existTag;
                }
                else
                {
                    var newTag = new Tag { Name = tag };
                    unitOfWork.Session.SaveOrUpdate(newTag);
                    newTags.Add(newTag);
                    mediaTag.Tag = newTag;
                }

                UpdateModifiedInformation(mediaTag);
                unitOfWork.Session.SaveOrUpdate(mediaTag);
            }
        }