中到高级LINQ /实体框架查询问题。标签项目

时间:2011-02-22 21:09:59

标签: c# linq linq-to-entities

我的目标是能够为项目添加标签,我应该能够传递标签名称的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)
                );                
        }

    }

1 个答案:

答案 0 :(得分:1)

我建议创建一个新的savetaggeditems方法,该方法在调用savechanges()之前需要多个标记并将它们全部插入。