Итерация по элементам IPersistentCollection - PullRequest
1 голос
/ 12 августа 2010

Я слушаю события аудита в NHibernate, в частности OnPostUpdateCollection(PostCollectionUpdateEvent @event)

Я хочу перебрать элементы @event.Collection.

@ event.Collection - это IPersistenCollection, который не реализует IEnumerable. Есть метод Entries, который возвращает IEnumerable, но он требует ICollectionPersister, когда я понятия не имею, где его можно получить.

Вопросы уже задаются здесь: http://osdir.com/ml/nhusers/2010-02/msg00472.html,, но не было окончательного ответа.

Заранее спасибо

Ответы [ 2 ]

5 голосов
/ 12 августа 2010

Pedro,

Поиск кода NHibernate Я мог найти следующий документ о методе GetValue IPersistentCollection (@ event.Collection):

/// <summary>
/// Return the user-visible collection (or array) instance
/// </summary>
/// <returns>
/// By default, the NHibernate wrapper is an acceptable collection for
/// the end user code to work with because it is interface compatible.
/// An NHibernate PersistentList is an IList, an NHibernate PersistentMap is an IDictionary
/// and those are the types user code is expecting.
/// </returns>
object GetValue();

С этим мы можем сделать выводприведите вашу коллекцию в IEnumerable, и все будет работать нормально.

Я собрал небольшой образец, отображающий сумку, и все получилось вот так:

public void OnPostUpdateCollection(PostCollectionUpdateEvent @event)
{
    foreach (var item in (IEnumerable)@event.Collection.GetValue())
    {
        // DO WTVR U NEED
    }
}

Надеюсь, это поможет!

Филипе

2 голосов
/ 18 марта 2011

Если вам нужно выполнить более сложные операции с коллекцией, вам, вероятно, понадобится сохранение коллекции, которое вы можете получить с помощью следующего метода расширения (по сути, вам нужно обойти видимость с помощью AbstractCollectionEvent.GetLoadedCollectionPersister метод):

public static class CollectionEventExtensions
{
    private class Helper : AbstractCollectionEvent
    {
        public Helper(ICollectionPersister collectionPersister, IPersistentCollection collection, IEventSource source, object affectedOwner, object affectedOwnerId)
            : base(collectionPersister, collection, source, affectedOwner, affectedOwnerId)
        {
        }

        public static ICollectionPersister GetCollectionPersister(AbstractCollectionEvent collectionEvent)
        {
            return GetLoadedCollectionPersister(collectionEvent.Collection, collectionEvent.Session);
        }
    }

    public static ICollectionPersister GetCollectionPersister(this AbstractCollectionEvent collectionEvent)
    {
        return Helper.GetCollectionPersister(collectionEvent);
    }
}

Надеюсь, это поможет!

С наилучшими пожеланиями,
Оливер Ханаппи

...