0

私のクエリは app.config から動的に取得されます。特定の列が含まれることはわかっています。処理後に返された各レコードの列を更新したいと考えています。.SubmitChanges()または類似のものを使用してこれを行うことはできますか? db.ExecuteQuery()それとも、更新SQLで別のものを書く必要がありますか?

DataClasses1DataContext db = new DataClasses1DataContext();
IEnumerable<invoice> invoices = db.ExecuteQuery<invoice>(ConfigurationManager.AppSettings["query_sql"].ToString());
foreach (invoice i in invoices)
{
    // do something with the invoice
    // flag the invoice as processed
    i.doc_processed = "Y";
    db.SubmitChanges();
}

アップデート

madd0 の回答のおかげで、アプリケーションで動的 SQL を許可する方法を作り直しました。app.config にクエリを入力する代わりに、アプリケーションは特定の名前の SQL ビューを探します。このようにしてビューを追加すると、LINQ は型/クラスを自動的に生成し、次を使用して追跡/更新できるようになります。.SubmiteChanges()

4

2 に答える 2

1

エンティティの更新に使用するSubmitChangesには、Linq to Sql でエンティティを追跡できる必要があります。これを行う最も簡単な方法は、Linq が型を生成できるようにすることです (または、一連の属性で POCO を装飾することもできます)。

invoiceLinq to Sql が追跡できるように型が生成されていない場合、DataContextがどのオブジェクトが変更されたかを判断したり、が呼び出されたUPDATEときに適切なステートメントを生成したりすることはできません。SubmitChanges

追跡対象のエンティティを使用していてObjectTrackingEnabledに設定されているが、Linq to Sql でクエリを生成する代わりにtrue使用したい場合でも、コマンドが追跡対象のすべてのフィールドを返し、テーブルに主キーがあることを確認する必要があります (これはのドキュメントで説明されています。)ExecuteQuery<T>SELECTExecuteQuery<T>

UPDATE最後に、元の回答で説明したように、いつでもクエリを手動で実行できますExecuteCommand。これは、ほとんどの場合、特に多数のエンティティを更新する場合にはるかに効果的であるため、ほとんどの更新を行う方法ですUPDATE.SubmitChanges手動で行う場合は、おそらく単一のコマンドとして記述できます。

独自のUPDATEステートメントを作成して で実行する場合は、SQL インジェクション攻撃を制限するために、パラメーターExecuteCommand使用し、連結を使用しないようにしてくださいパラメータ化されたクエリの例は、 のドキュメントにあります。ExecuteCommand

于 2013-03-09T12:11:45.590 に答える
0

いつものように、それは依存します。

あなたの場合、それは // 請求書で何かを行います。とにかく、その部分の各請求書の多くのフィールドに触れる場合、このコードは問題ありません。submitchanges をループ外に移動できるという事実を除いて:

  foreach (invoice i in invoices)
    {
        // do something with the invoice
        // flag the invoice as processed
        i.doc_processed = "Y";
    }
 db.SubmitChanges();

そのため、単一のトランザクションの利点があります (ただし、複数の更新が行われるため、大量の請求書ではパフォーマンスが最適ではありません)。

// do something が比較的平易で単純な場合、 // do something ロジック全体をクエリ内でコーディングし、それを SQL 内で実行して、コードを効果的に次のように削減します。

db.ExecuteQuery<invoice>(ConfigurationManager.AppSettings["do_something_update_query_sql"].ToString());

この方法は最もパフォーマンスが高くなりますが、Linq2sql の ORM 部分は一切使用しません。

于 2013-03-09T12:29:33.617 に答える