私は特定のマーチャントへの注文を示すレポートを持っており、支払いステータスのフィルターを追加する必要があるまでは正常に機能していました。
これは、フィルターごとにフィルターするクエリを作成する方法です。
var queryOrder = context.Orders.Select(m=>m);
if (viewModel.InitialDate.HasValue)
queryOrder = queryOrder.Where(m => m.CreatedDate.Date >= viewModel.InitialDate.Value);
(...) /* continues building the query, filter by filter */
if (viewModel.SelectedPaymentStatus != null)
queryOrder = queryOrder.Where(m => viewModel.SelectedPaymentStatus.Contains(m.Payments.Select(p => p.PaymentStatusId).Single().ToString()));
queryOrder = queryOrder.Where(m => m.MerchantId == merchantId);
を実行するqueryOrder
と、 だけでもqueryOrder.Count()
実行に 1 分以上かかります。SQL Server のプロファイリング ツールを使用して、生成されたクエリを次のように抽出しました。
SELECT [t0].[Id], [t0].[CustomerId], [t0].[MerchantId], [t0].[OrderNumber], [t0].[Amount], [t0].[SoftDescriptor], [t0].[ShippingMethod], [t0].[ShippingPrice], [t0].[IpAddress], [t0].[SellerComment], [t0].[CreatedDate]
FROM [dbo].[Order] AS [t0]
WHERE ([t0].[MerchantId] = @p0)
AND ((CONVERT(NVarChar,(
SELECT [t1].[PaymentStatusId]
FROM [dbo].[Payment] AS [t1]
WHERE [t1].[OrderId] = [t0].[Id]
))) IN (@p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8))
@p0 パラメータは MerchantId の Guid であり、@p1 から @p8 までの数値文字列は、 "1"
paymentStatusId"8"
を表します。
行をスキップした場合:
if (viewModel.SelectedPaymentStatus != null)
queryOrder = queryOrder.Where(m => viewModel.SelectedPaymentStatus.Contains(m.Payments.Select(p => p.PaymentStatusId).Single().ToString()));
クエリは 1 秒未満で実行されます。しかし、私がそれを使用すると、パフォーマンスは床にぶつかります。これを解決する方法に関するヒントはありますか?