我的目标是能够为项目添加标签,我应该能够传递标签名称的CSV字符串,如果该项目尚未链接到标签,则链接。
我的代码正如您在此消息底部看到的那样,但我想知道这是否是最有效的方法。可以用较少的查询来完成吗?
一个小数据库方案信息:
3表: 标签,TaggedItems,ContentType
标签表有:名称,TagID
TaggedItems表包含:TagID,ContentTypeID,ContentTypePrimaryKey
ContentType表具有:ContentTypeID,Name
该项是标记名称列表,内容类型对象是方法的过去, 并且只要列表中的a标签尚未链接到内容类型对象(即在taggedItems表中),然后添加它。
public void AssignTagsByNameToContentType(string csvOfTagNames, IContentType contentObject)
{
string[] tags = csvOfTagNames.Split(',');
//get me all the tags that hav been linked to this content object already (call to the DB:( )
var existingTags = GetTagsForContentType(contentObject);
//filter out the tags past that are already linked to this content object (call to the DB :( )
var newTags = from t in tags
where !(from et in existingTags
select et.Name)
.Contains(t)
select t;
//add the new tags to the content object, multiple calls to the DB :(
foreach (var newTag in newTags)
{
taggedItemsRepo.SaveTaggedItem(new TaggedItem() {
ContentObjectPK = contentObject.ID,
ContentTypeID = GetContentTypeIDFromSession(contentObject),
TagID = tagsRepo.GetTagByName(newTag)
);
}
}
答案 0 :(得分:1)
我建议创建一个新的savetaggeditems方法,该方法在调用savechanges()之前需要多个标记并将它们全部插入。