public static void EnsureTag(Tag[] allTags, ITaggable taggable, Tag tag) { // we change taggable (e.g. Link) but do not call dbContext.Update as this is done // by caller. this way we can prevent Modified-property on taggable being updated, // just because TagString changed (e.g. when tag hierarchy has changed). if we add // a tag to a taggable, dbContext.Update should be called by caller, as he is actually // changing the taggable. string currentTagString = taggable.TagString ?? string.Empty; bool hasTags = !string.IsNullOrEmpty(currentTagString); string tagPath = GetTagPath(allTags, tag); if (hasTags && currentTagString.Contains(tagPath)) { return; } taggable.TagString = hasTags ? string.Concat(currentTagString, Separator, tagPath) : tagPath; }
private static string GetTagPath(Tag[] allTags, Tag tag) { Tag current = tag; var tagIds = new List<int>(); while (current != null) { tagIds.Add(current.Id); current = allTags.SingleOrDefault(t => t.Id == current.ParentId); } tagIds.Reverse(); return string.Concat(PathStarter, JoinTagPathElements(tagIds.ToArray()), PathEnder); }
public static void EnsureTag(IDbContext dbContext, ITaggable taggable, Tag tag) { EnsureTag(dbContext.Tags.ToArray(), taggable, tag); }
public static void SyncTagStringWithTagIds(IDbContext dbContext, Tag[] allTags, Link link) { link.ClearTagString(); foreach (Tag tag in link.TagIds .Select(tagId => allTags.FirstOrDefault(t => t.Id == tagId)) .Where(t => t != null)) { EnsureTag(allTags, link, tag); } }