Fluent NHibernate, Getting or Creating a new `Tag` Edit

The rest of my code utilises the Command/Query seperation pattern. I'll probably move this out into a command and a query but for now I've written this directly in my MVC controller for brevity.

Original

I'm quite new to Fluent NHibernate and its various workings. This code is designed to receive an array of tag names, get those tags from the database and then create any tags that were in the array but not already in the database.

Here's the code I've just written:

private IEnumerable&lt;Tag&gt; GetOrCreateTags(IEnumerable&lt;string&gt; tagNames)
        {

            var tagCriteria = _nHibernateSession.CreateCriteria&lt;Tag&gt;();

            var or = Restrictions.Disjunction();

            foreach (var tagName in tagNames)
            {
                or.Add(Restrictions.Eq("Name", tagName));
            }
            tagCriteria.Add(or);

            var tagsFromTagNames = tagCriteria.List&lt;Tag&gt;();

            foreach (var newTagNeverSeen in tagNames.Except(tagsFromTagNames
                                                           .Select(x =&gt; x.Name)))
            {
                using (var transaction = _nHibernateSession.BeginTransaction())
                {
                    var newTag = new Tag
                                     {
                                         Name = newTagNeverSeen,
                                         Enabled = true,
                                         DateCreated = DateTime.Now
                                     };
                    _nHibernateSession.SaveOrUpdate(newTag);
                    tagsFromTagNames.Add(newTag);
                    transaction.Commit();
                }
            }
            return tagsFromTagNames;
        }


How would you improve this? I feel like I'm doing too much here already so I'll likely refactor this to split it out.
Admittedly I am using a really old version of nhibernate, but I think this is still there (to replace a few lines):

Restrictions.InG("Name", tagNames.ToList())


I think I would also bring the using statement outside of the loop:

private IEnumerable&lt;Tag&gt; GetOrCreateTags(IEnumerable&lt;string&gt; tagNames)
    {
        var tagList = tagNames.ToList(); //or make the parameter above an ICollection&lt;string&gt;

        var tagCriteria = _nHibernateSession.CreateCriteria&lt;Tag&gt;();
        tagCriteria.Add(Restrictions.InG("Name", tagList));

        var tagsFromTagNames = tagCriteria.List&lt;Tag&gt;();

        //naming this for readability
        var existingTagNames = tagsFromTagNames.Select(x =&gt; x.Name);

        var newTags = tagList
            .Except(existingTagNames)
            .Select(t =&gt; new Tag
                           {
                               Name = newTagNeverSeen,
                               Enabled = true,
                               DateCreated = DateTime.Now
                           }); //moving this outside the loop makes the loop cleaner

        if (newTags.Any())
        {
            using (var transaction = _nHibernateSession.BeginTransaction())
            {
                foreach (var tag in newTags)
                {
                    _nHibernateSession.SaveOrUpdate(tag);
                    tagsFromTagNames.Add(tag);
                }
                transaction.Commit();
            }
        }
        return tagsFromTagNames;
    }