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