13

これは簡単な質問に違いありません。基準が与えられた場合、基準を満たすエンティティをどのように削除しますか?

根拠:

HQL および NH 基準は NHibernate 固有の構造であり、サーバー側の DAL 実装の詳細です。それらがクライアント側に「漏れる」ことは望ましくありません。したがって、クライアント側は、サーバーが処理する LINQ 式を提供します。これまで、select リクエストと LINQ to NHibernate が問題なく処理していたリクエストがありました。

ただし、一括削除操作を実装する必要があります。いつものように、クライアント側は LINQ 式を提供し、サーバーは式を満たすエンティティを削除します。残念ながら、LINQ to NHibernate はここでは役に立ちません。できることは、指定された LINQ 式を NHibernate 基準に変換することだけです。

とにかく、これは話です。クライアント側は NHibernate をまったく認識していないことを強調したいと思います。

PS

NH2.1を使用しています

4

4 に答える 4

7

基準を使用して要素の ID を選択し、それらを文字列に結合し、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 セクションについてはよくわかりません) が、ご理解いただけたと思います: プロジェクションのおかげでオブジェクト全体を取得するのではなく、インデックスのみを取得します。

于 2010-06-18T09:44:29.527 に答える
3

簡単に言えば、2.1.2 まではできません。

ただし、LINQ 式を HQL に (または ICriteria を HQL に) 変換できる場合ISession.Delete()は、渡された HQL 文字列を使用するオーバーロードされたメソッドを使用できます。

于 2010-06-18T10:13:28.490 に答える
-3

リポジトリ/dao/persistencemanager/whatever クラスで:

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);

            }

        }

Davy Brion の投稿Data Access with NHibernateを参照してください。

編集

私の知る限り、Criteria を使用する場合は、オブジェクトをロードし、それらを繰り返し処理して削除する必要があります。または、HQL を使用するか、SQL をセッションに渡します。

于 2009-08-25T09:01:33.600 に答える
-5

これは古い質問ですが、議論のためです。リポジトリ パターンを使用する場合は、次のことを行う delete メソッドを宣言できます。

public void Delete(System.Linq.Expressions.Expression<System.Func<TEntity, bool>> predicate)
{
    var entities = _session.Query<TEntity>().Where(predicate);
    foreach (var entity in entities)
        _session.Delete(entity);
}

コードは、リポジトリ インターフェイスを十分に汎用的にするために式を使用しているため、たとえば Entity Framework リポジトリも実装できることに注意してください。

于 2011-08-19T07:59:56.113 に答える