/// <summary> /// 删除内容项的标签 /// </summary> /// <param name="itemId">内容项Id</param> /// <param name="tagInOwnerId">标签与拥有者关联</param> public int DeleteTagFromItem(long itemId, long tagInOwnerId) { PetaPocoDatabase dao = CreateDAO(); dao.OpenSharedConnection(); var sql = Sql.Builder; sql.Select("TagName,") .From("tn_ItemsInTags") .Where("tagInOwnerId = @0", tagInOwnerId) .Where("ItemId = @0", itemId); dynamic tagInfo = dao.First <dynamic>(sql); int affectCount = 0; if (tagInfo != null) { sql = Sql.Builder.Append("delete from tn_ItemsInTags where itemId = @0 and TagInOwnerId = @1", itemId, tagInOwnerId); affectCount = dao.Execute(sql); if (affectCount > 0) { List <Sql> sqls = new List <Sql>(); sqls.Add(Sql.Builder.Append("update tn_TagsInOwners set ItemCount = ItemCount - 1") .Where("ItemCount > 0 and Id = @0", tagInOwnerId)); sqls.Add(Sql.Builder.Append("update tn_Tags set ItemCount = ItemCount - 1") .Where("ItemCount > 0 and TagName = @0 and TenantTypeId = @1", tagInfo.TagName, tagInfo.TenantTypeId)); affectCount = dao.Execute(sqls); RealTimeCacheHelper.IncreaseAreaVersion("TagName", tagInfo.TagName); RealTimeCacheHelper.IncreaseAreaVersion("ItemId", itemId); } } dao.CloseSharedConnection(); return(affectCount); }
/// <summary> /// 为多个内容项添加相同标签 /// </summary> /// <param name="itemIds">内容项Id</param> /// <param name="tenantTypeId">租户类型Id</param> /// <param name="ownerId">拥有者Id</param> /// <param name="tagName">标签名</param> public int AddItemsToTag(IEnumerable <long> itemIds, string tenantTypeId, long ownerId, string tagName) { PetaPocoDatabase dao = CreateDAO(); IList <Sql> sqls = new List <Sql>(); var sql = Sql.Builder; dao.OpenSharedConnection(); //创建标签 sql.From("tn_Tags") .Where("TenantTypeId = @0", tenantTypeId) .Where("TagName = @0", tagName); var tag = dao.FirstOrDefault <Tag>(sql); if (tag == null) { sqls.Add(Sql.Builder.Append("insert into tn_Tags (TenantTypeId,TagName,DateCreated) values(@0,@1,@2)", tenantTypeId, tagName, DateTime.UtcNow)); } //创建标签与用户的关联 sql = Sql.Builder; sql.From("tn_TagsInOwners") .Where("TenantTypeId = @0", tenantTypeId) .Where("TagName = @0", tagName) .Where("OwnerId = @0", ownerId); var tagInOwner = dao.FirstOrDefault <TagInOwner>(sql); if (tagInOwner == null) { sqls.Add(Sql.Builder.Append("insert into tn_TagsInOwners (TenantTypeId,TagName,OwnerId) values(@0,@1,@2)", tenantTypeId, tagName, ownerId)); } int affectCount = 0, itemCount = 0; foreach (var itemId in itemIds) { if (itemId <= 0) { continue; } //创建标签与内容项的关联 sqls.Add(Sql.Builder.Append("insert into tn_ItemsInTags (TagName,TagInOwnerId,ItemId,TenantTypeId) select @0,Id,@1,@2 from tn_TagsInOwners", tagName, itemId, tenantTypeId) .Where("TenantTypeId = @0", tenantTypeId) .Where("OwnerId = @0", ownerId) .Where("TagName = @0", tagName)); itemCount++; } //增加标签相关统计 sqls.Add(Sql.Builder.Append("update tn_Tags Set ItemCount = ItemCount + @2,OwnerCount = OwnerCount + 1 where TenantTypeId = @0 and TagName = @1", tenantTypeId, tagName, itemCount)); //增加拥有者标签内容项统计 sqls.Add(Sql.Builder.Append("update tn_TagsInOwners set ItemCount = ItemCount + @3 where TenantTypeId = @0 and TagName = @1 and OwnerId = @2", tenantTypeId, tagName, ownerId, itemCount)); //通过事务来控制多条语句执行时的一致性 using (var transaction = dao.GetTransaction()) { dao.Execute(sqls); transaction.Complete(); } if (affectCount > 0) { foreach (var itemId in itemIds) { if (itemId <= 0) { continue; } RealTimeCacheHelper.IncreaseAreaVersion("ItemId", itemId); } sql = Sql.Builder; sql.Select("*") .From("tn_TagsInOwners") .Where("TenantTypeId = @0", tenantTypeId) .Where("TagName = @0", tagName) .Where("OwnerId = @0", ownerId); tagInOwner = dao.First <TagInOwner>(sql); EntityData entityData = EntityData.ForType(typeof(TagInOwner)); if (tagInOwner != null) { entityData.RealTimeCacheHelper.IncreaseEntityCacheVersion(tagInOwner.Id); } entityData.RealTimeCacheHelper.IncreaseAreaVersion("OwnerId", ownerId); } dao.CloseSharedConnection(); return(affectCount); }
/// <summary> /// 为内容项批量设置标签 /// </summary> /// <param name="tagNames">标签名称集合</param> /// <param name="tenantTypeId">租户类型Id</param> /// <param name="ownerId">拥有者Id</param> /// <param name="itemId">内容项Id</param> public int AddTagsToItem(string[] tagNames, string tenantTypeId, long ownerId, long itemId) { int affectCount = 0; PetaPocoDatabase dao = CreateDAO(); dao.OpenSharedConnection(); foreach (string tagName in tagNames) { if (string.IsNullOrEmpty(tagName)) { continue; } IList <Sql> sqls = new List <Sql>(); //创建标签 var sql = Sql.Builder; sql.From("tn_Tags") .Where("TenantTypeId = @0", tenantTypeId) .Where("TagName = @0", tagName); var tag = dao.FirstOrDefault <Tag>(sql); if (tag == null) { sqls.Add(Sql.Builder.Append("insert into tn_Tags (TenantTypeId,TagName,DateCreated) values (@0,@1,@2)", tenantTypeId, tagName, DateTime.UtcNow)); } //增加标签相关统计 sqls.Add(Sql.Builder.Append("update tn_Tags Set ItemCount = ItemCount + 1 where TenantTypeId = @0 and TagName = @1", tenantTypeId, tagName)); //创建标签与用户的关联 sql = Sql.Builder; sql.From("tn_TagsInOwners") .Where("TenantTypeId = @0", tenantTypeId) .Where("TagName = @0", tagName) .Where("OwnerId = @0", ownerId); var tagInOwner = dao.FirstOrDefault <TagInOwner>(sql); if (tagInOwner == null) { sqls.Add(Sql.Builder.Append("update tn_Tags Set OwnerCount = OwnerCount + 1 where TenantTypeId = @0 and TagName = @1", tenantTypeId, tagName)); dao.Execute(Sql.Builder.Append("insert into tn_TagsInOwners (TenantTypeId,TagName,OwnerId) values (@0,@1,@2)", tenantTypeId, tagName, ownerId)); tagInOwner = dao.FirstOrDefault <TagInOwner>(sql); } else { //增加拥有者标签内容项统计 sqls.Add(Sql.Builder.Append("update tn_TagsInOwners set ItemCount = ItemCount + 1 where TenantTypeId = @0 and TagName = @1 and OwnerId = @2", tenantTypeId, tagName, ownerId)); } sql = Sql.Builder; sql.From("tn_ItemsInTags") .Where("TagName = @0", tagName) .Where("TagInOwnerId = @0", tagInOwner.Id) .Where("ItemId = @0", itemId); var itemInTag = dao.FirstOrDefault <ItemInTag>(sql); if (itemInTag == null) { //创建标签与内容项的关联 sqls.Add(Sql.Builder.Append("insert into tn_ItemsInTags (TagName,TagInOwnerId,ItemId,tenantTypeId) select @0,Id,@1,@2 from tn_TagsInOwners", tagName, itemId, tenantTypeId) .Where("TenantTypeId = @0", tenantTypeId) .Where("TagName = @0", tagName) .Where("OwnerId = @0", ownerId)); } //通过事务来控制多条语句执行时的一致性 using (var transaction = dao.GetTransaction()) { affectCount = dao.Execute(sqls); transaction.Complete(); } if (affectCount > 0) { sql = Sql.Builder; sql.From("tn_TagsInOwners") .Where("TenantTypeId = @0", tenantTypeId) .Where("TagName = @0", tagName) .Where("OwnerId = @0", ownerId); tagInOwner = dao.First <TagInOwner>(sql); if (tagInOwner != null) { EntityData.ForType(typeof(TagInOwner)).RealTimeCacheHelper.IncreaseEntityCacheVersion(tagInOwner.Id); } } } if (tagNames.Length > 0) { EntityData.ForType(typeof(TagInOwner)).RealTimeCacheHelper.IncreaseAreaVersion("OwnerId", ownerId); RealTimeCacheHelper.IncreaseAreaVersion("ItemId", itemId); foreach (var tagName in tagNames) { if (string.IsNullOrEmpty(tagName)) { continue; } RealTimeCacheHelper.IncreaseAreaVersion("TagName", tagName); } } dao.CloseSharedConnection(); return(affectCount); }