4

だから私は非常に単純な構造を持っています:

  • 一意の OrderNumber を持つ注文があります
  • 注文には多くの OrderRows があります
  • OrderRows には、position (OrderRow 内の RowExtra のシーケンス番号) と文字列である Info の 2 つのフィールドを持つ多くの RowExtras があります。多くの場合、OrderRow には複数の RowExtra がありません。

(今のところ、ばかげた構造は気にしないでください。

これで、次の 3 つのプロパティを持つオブジェクトのリストを取得できます。

  • 注文番号
  • 位置
  • 情報

私がやりたいことは、1) 指定された OrderNumber/Position ペアを持つ RowExtra がデータベースに存在するかどうかを確認し、存在する場合は 2) Info プロパティを更新することです。

私はこれを達成するためにいくつかの異なる方法を試しましたが、せいぜい非常に悪い結果でした. ソリューションはオブジェクトのリストをループし、次のようなクエリを発行します。

myContext.RowExtras.Where(x => x.Position == currentPosition &&
                          x.OrderRow.Order.OrderNumber == currentOrderNumber) 

または反対側から行く

myContext.Orders.Where(x => x.OrderNumber == currentOrderNumber)
                .SelectMany(x => x.OrderRows)
                .SelectMany(x => x.RowExtras)
                .Where(x => x.Position == currentPosition)

次に、カウントが 1 に等しいかどうかを確認し、そうであればプロパティを更新し、そうでなければ次の項目に進みます。

現在、データベースには約 4000 の RowExtra があり、その約半分を更新する必要があります。これらの方法では、手順が完了するまでに数分かかるため、実際には受け入れられません。私が理解していないのは、必要な RowExtra を返す SQL 句を手動で記述するのは非常に簡単であるため、なぜこんなに時間がかかるのかということです (where 部分に 2 つの結合と 2 つの条件があるだけです)。

私が達成できた最高のパフォーマンスは、次のようなコンパイル済みクエリを使用したものでした

Func<MyContext, int, string, IQueryable<RowExtra>> query = 
CompiledQuery.Compile( 
  (MyContext ctx, int position, string orderNumber) => 
    from extra in ctx.RowExtras 
    where 
      extra.Position == position && 
      extra.OrderRow.Order == orderNumber 
    select extra);

次に、リスト内の各オブジェクトに対して上記のクエリを呼び出します。しかし、このアプローチでさえ 1 分以上かかりました。では、実際にこれを妥当な時間枠内で実行するにはどうすればよいでしょうか?

また、説明が長くなりすぎて申し訳ありませんが、誰かが助けてくれることを願っています!

4

1 に答える 1

1

データベース呼び出しの数を最小限に抑えるようにしてください。経験則として、スカラーを返すだけの場合でも、少なくとも約 10 ミリ秒かかります。

したがって、一般的には、必要なすべてのデータを一度に取得し、コードで変更してから保存します。

List<Order> orders = myContext.Orders
    .Include( "OrderRows.RowExtras" )
    .Where( ... select all the orders you want, not just one at a time ... )
    .ToList();

foreach ( Order order in orders )
{
    ... execute your logic on the in-memory model
}

myContext.SaveChanges();
于 2012-05-02T17:47:44.750 に答える