Fluent NHibernate, Getting or Creating a new `Tag`
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;
    }