2011-02-22 48 views
2

我的目標是能夠添加標籤到一個項目,我應該能夠傳遞標籤名稱的CSV字符串,並且如果項目尚未鏈接到標籤,那麼它將被鏈接。中提前LINQ/EntityFramework查詢問題。標籤項目

我的代碼就像你在這封郵件底部看到的一樣,但我想知道這是否是最有效的方式。這可以用更少的查詢來完成嗎?

一個小數據庫方案信息:

3個表: 標籤,TaggedItems,則contentType

標籤表有:名稱,標籤識別

TaggedItems表有:標籤識別,ContentTypeID,ContentTypePrimaryKey

ContentType表具有:ContentTypeID,名稱

該項是標籤名稱的列表,並且內容類型對象已經過去到方法 ,並且只要列表中的標籤尚未鏈接到內容類型對象(即,在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) 
       );     
     } 

    } 

回答

1

我會建議創建一個新的savetaggeditems方法,它需要多個標記並在調用savechanges()之前插入它們。

+0

這是一個非常有效的點,我已經實施了你的建議。我重新編寫了代碼,現在我正在分析它。我會很快發佈。 – Mike 2011-02-23 22:18:25