Как можно удалить объекты NHibernate с помощью критерии?

Вы могли использовать keydown, keyup и keypress события также.

13
задан Brian Tompsett - 汤莱恩 4 July 2015 в 13:04
поделиться

3 ответа

В вашем репозитории / dao / persistencemanager / любой класс:

public IEnumerable<T> FindAll(DetachedCriteria criteria)

        {

            return criteria.GetExecutableCriteria(Session).List<T>();

        }

, а затем

public void Delete(DetachedCriteria criteria)

        {

            foreach (T entity in FindAll(criteria))

            {

                Delete(entity);

            }

        }

См. Сообщение Дэви Бриона Доступ к данным с помощью NHibernate .

Изменить ]:

Насколько мне известно, если вы хотите использовать критерии, вам нужно загрузить объекты и перебрать их, чтобы удалить их. В качестве альтернативы используйте HQL или передайте SQL в сеанс.

-3
ответ дан 2 December 2019 в 02:23
поделиться

Проще говоря, до 2.1.2 вы не можете.

Однако, если вы можете преобразовать выражение LINQ в HQL (или ICriteria в HQL), вы можете использовать перегруженный метод ISession.Delete () , который использует переданную строку HQL.

3
ответ дан 2 December 2019 в 02:23
поделиться

Вы можете использовать критерии, чтобы выбрать идентификаторы ваших элементов, объединить их в строку и использовать HQL для их удаления?

Что-то вроде:

public void Delete(ICriteria criteria, string keyName, string tableName)
{
    criteria.setProjection(Projections.Attribute(keyName));
    IList<int> itemIds = criteria.List<int>();

    string collection = string.Join(",", Array.ConvertAll<int, string>(itemIds, Convert.ToString));

    Session.HQL(string.Format("delete from {0} where {1} in ({2})", tableName, keyName, collection);
}

Этот код не был протестирован или скомпилирован (в частности, я не уверен в разделе HQL), но я думаю, что вы уловили идею: благодаря проекции мы извлекаем не все объекты целиком, а только индексы.

7
ответ дан 2 December 2019 в 02:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: