0

データベース テーブルの一部を定期的にパージする必要があります。パージは、子を持たないすべての親を削除することで構成されます。現在の実装では、ストアド プロシージャを使用してこのタスクを完了します。私がしたいのは、ストアド プロシージャを排除し、NHibernate Linq クエリを介して削除アクションを実現することです。たとえば、アイテムのないすべての請求書を削除するクエリが必要です。

4

2 に答える 2

2

DB に対して多くの削除クエリを実行したい場合を除き、Linq または QueryOver を使用した簡単な回答はできません。最初に ID のリストを作成してから、それをサブクエリで使用する場合を除きます。ワンショット削除はどのような場合でも面倒ですORM

ほとんどのソリューションでは、ストアド プロシージャまたは埋め込みの名前付きクエリ (SQL または HQL) を使用します。

于 2013-04-15T10:59:15.030 に答える
1

を使用すると、削除したいタイプの永続オブジェクトQueryOverをすべて見つけることができます。しかし、リッポが言ったように、これはいくつかの削除クエリを起動します。これを少し変更して、請求書 ID の配列を作成できます。そして、 を使用してすべてのレコードを一度に削除する 1 つの SqlQuery を作成します。InvoiceYourSession.CreateSQLQuery

var invoicesToDelete = YourSession.QueryOver<Invoice>().Where(invoice => invoice.items == null).List();
var invoiceIds = new List<int>();
foreach(var invoice in invoicesToDelete)
{
    invoiceIds.Add(invoice.Id);
}
string queryString = "delete from invoice where id in(";
foreach(var id in invoiceIds)
{
    queryString = queryString + id + ",";
}
queryString = queryString.TrimEnd(',');
queryString = queryString + ")";
ISQLQuery query = YourSession.CreateSQLQuery(queryString);
queryString.UniqueResult();
YourSession.Transaction.Commit();

コードは乱雑に見えますが、より効率的になるはずです。

于 2013-04-15T11:36:07.283 に答える